每日一道leetcode(2026.03.25):等和矩阵分割 I
题目
给你一个由正整数组成的 m x n 矩阵 grid。你的任务是判断是否可以通过 一条水平或一条垂直分割线 将矩阵分割成两部分,使得:
- 分割后形成的每个部分都是 非空 的。
- 两个部分中所有元素的和 相等 。
如果存在这样的分割,返回true;否则,返回false。
示例 1:
输入: grid = [[1,4],[2,3]]
输出: true
解释:

在第 0 行和第 1 行之间进行水平分割,得到两个非空部分,每部分的元素之和为 5。因此,答案是 true。
分析
此题比较好理解,将二维矩阵一分为二,让两边的数组之和相等。
需要注意的是,所有元素均为正整数,我们的分割线从上往下和从左往右两个方向经历两次遍历移动,如果移动过程中出现,上面的和大于下面的和,或者左边的和大于右边的和,那就没必要再移动了,因为再移动只会越差越大。
移动过程中,上面或左边的和的增量,与下面和右边的和的减量是相等的,都等于那一行或列的数值之和,有了这个思路,那其实从原点开始,上面和左边的基数从0开始增,下面和右边的基数从全集合之和开始减。
代码实现
java
class Solution {
public boolean canPartitionGrid(int[][] grid) {
// 计算所有数值之和
long sum = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
sum += grid[i][j];
}
}
// 横分
long up = 0;
long down = sum;
for (int i = 0; i <= grid.length - 2; i++) {
// 计算第i行的值
long rowSum = 0;
for (int j = 0; j < grid[i].length; j++) {
rowSum += grid[i][j];
}
up += rowSum;
down -= rowSum;
if (up == down) {
return true;
} else if (up > down) {
break;
}
}
// 竖分
long left = 0;
long right = sum;
for (int i = 0; i <= grid[0].length - 2; i++) {
// 计算第i列的值
long colSum = 0;
for (int j = 0; j < grid.length; j++) {
colSum += grid[j][i];
}
left += colSum;
right -= colSum;
if (left == right) {
return true;
} else if (left > right) {
break;
}
}
return false;
}
}
