每日一道leetcode(2026.03.25):等和矩阵分割 I

每日一道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;
    }
}
相关推荐
jktantan18 分钟前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..39 分钟前
【C语言】猜数字游戏
c语言·算法·游戏
LabVIEW开发1 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 2291 小时前
C++算法(六)
开发语言·c++·算法
Dumbness2 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka2 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
UIU1143 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
旖旎夜光3 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由20203 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
D e re k ZH3 小时前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin