|
| 1 | +--- |
| 2 | +title: 3546.等和矩阵分割 I:记总记当前(遍历) |
| 3 | +date: 2026-03-25 22:08:15 |
| 4 | +tags: [题解, LeetCode, 中等, 数组, 枚举, 矩阵, 前缀和, 遍历] |
| 5 | +categories: [题解, LeetCode] |
| 6 | +index_img: https://pic.leetcode.cn/1746839596-kWigaF-lc.jpeg |
| 7 | +--- |
| 8 | + |
| 9 | +# 【LetMeFly】3546.等和矩阵分割 I:记总记当前(遍历) |
| 10 | + |
| 11 | +力扣题目链接:[https://leetcode.cn/problems/equal-sum-grid-partition-i/](https://leetcode.cn/problems/equal-sum-grid-partition-i/) |
| 12 | + |
| 13 | +<p>给你一个由正整数组成的 <code>m x n</code> 矩阵 <code>grid</code>。你的任务是判断是否可以通过 <strong>一条水平或一条垂直分割线 </strong>将矩阵分割成两部分,使得:</p> |
| 14 | + |
| 15 | +<ul> |
| 16 | + <li>分割后形成的每个部分都是 <strong>非空 </strong>的。</li> |
| 17 | + <li>两个部分中所有元素的和 <strong>相等 </strong>。</li> |
| 18 | +</ul> |
| 19 | + |
| 20 | +<p>如果存在这样的分割,返回 <code>true</code>;否则,返回 <code>false</code>。</p> |
| 21 | + |
| 22 | +<p> </p> |
| 23 | + |
| 24 | +<p><strong class="example">示例 1:</strong></p> |
| 25 | + |
| 26 | +<div class="example-block"> |
| 27 | +<p><strong>输入:</strong> grid = [[1,4],[2,3]]</p> |
| 28 | + |
| 29 | +<p><strong>输出:</strong> true</p> |
| 30 | + |
| 31 | +<p><strong>解释:</strong></p> |
| 32 | + |
| 33 | +<p><img alt="" src="https://pic.leetcode.cn/1746839596-kWigaF-lc.jpeg" style="height: 200px; width: 200px;" /></p> |
| 34 | + |
| 35 | +<p>在第 0 行和第 1 行之间进行水平分割,得到两个非空部分,每部分的元素之和为 5。因此,答案是 <code>true</code>。</p> |
| 36 | +</div> |
| 37 | + |
| 38 | +<p><strong class="example">示例 2:</strong></p> |
| 39 | + |
| 40 | +<div class="example-block"> |
| 41 | +<p><strong>输入:</strong> grid = [[1,3],[2,4]]</p> |
| 42 | + |
| 43 | +<p><strong>输出:</strong> false</p> |
| 44 | + |
| 45 | +<p><strong>解释:</strong></p> |
| 46 | + |
| 47 | +<p>无论是水平分割还是垂直分割,都无法使两个非空部分的元素之和相等。因此,答案是 <code>false</code>。</p> |
| 48 | +</div> |
| 49 | + |
| 50 | +<p> </p> |
| 51 | + |
| 52 | +<p><strong>提示:</strong></p> |
| 53 | + |
| 54 | +<ul> |
| 55 | + <li><code>1 <= m == grid.length <= 10<sup>5</sup></code></li> |
| 56 | + <li><code>1 <= n == grid[i].length <= 10<sup>5</sup></code></li> |
| 57 | + <li><code>2 <= m * n <= 10<sup>5</sup></code></li> |
| 58 | + <li><code>1 <= grid[i][j] <= 10<sup>5</sup></code></li> |
| 59 | +</ul> |
| 60 | + |
| 61 | +<p> </p> |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | +## 解题方法:三次遍历 |
| 66 | + |
| 67 | +第一次遍历计算整个grid的元素之和,若非偶数直接返回`false`,若为偶数则直接除以$2$。 |
| 68 | + |
| 69 | +接着从上往下遍历grid,每次累加一整行的元素,若恰好等于除以二后的总和则返回true,大于则break。 |
| 70 | + |
| 71 | +最后从左往右遍历,方法和从上往下遍历同理。 |
| 72 | + |
| 73 | ++ 时间复杂度$O(nm)$ |
| 74 | ++ 空间复杂度$O(1)$ |
| 75 | + |
| 76 | +### AC代码 |
| 77 | + |
| 78 | +#### C++ |
| 79 | + |
| 80 | +```cpp |
| 81 | +/* |
| 82 | + * @LastEditTime: 2026-03-25 22:05:04 |
| 83 | + */ |
| 84 | +#define CHECK_AND_BREAK(now, sum) \ |
| 85 | + if ((now) == (sum)) { \ |
| 86 | + return true; \ |
| 87 | + } \ |
| 88 | + if ((now) > (sum)) { \ |
| 89 | + break; \ |
| 90 | + } |
| 91 | +typedef long long ll; |
| 92 | +class Solution { |
| 93 | +public: |
| 94 | + bool canPartitionGrid(vector<vector<int>>& grid) { |
| 95 | + ll sum = 0; |
| 96 | + for (vector<int>& row : grid) { |
| 97 | + for (int& v : row) { |
| 98 | + sum += v; |
| 99 | + } |
| 100 | + } |
| 101 | + if (sum % 2) { |
| 102 | + return false; |
| 103 | + } |
| 104 | + sum /= 2; |
| 105 | + |
| 106 | + ll now = 0; |
| 107 | + for (vector<int>& row : grid) { |
| 108 | + for (int& v : row) { |
| 109 | + now += v; |
| 110 | + } |
| 111 | + CHECK_AND_BREAK(now, sum) |
| 112 | + } |
| 113 | + |
| 114 | + now = 0; |
| 115 | + for (int j = 0; j < grid[0].size(); j++) { |
| 116 | + for (int i = 0; i < grid.size(); i++) { |
| 117 | + now += grid[i][j]; |
| 118 | + } |
| 119 | + CHECK_AND_BREAK(now, sum) |
| 120 | + } |
| 121 | + |
| 122 | + return false; |
| 123 | + } |
| 124 | +}; |
| 125 | + |
| 126 | +``` |
| 127 | + |
| 128 | +> 同步发文于[CSDN](https://letmefly.blog.csdn.net/article/details/159476515)和我的[个人博客](https://blog.letmefly.xyz/),原创不易,转载经作者同意后请附上[原文链接](https://blog.letmefly.xyz/2026/03/25/LeetCode%203546.%E7%AD%89%E5%92%8C%E7%9F%A9%E9%98%B5%E5%88%86%E5%89%B2I/)哦~ |
| 129 | +> |
| 130 | +> 千篇源码题解[已开源](https://github.com/LetMeFly666/LeetCode) |
0 commit comments