Kimi LeetCode 3548. 等和矩阵分割 II Java实现

📅 2026/7/13 0:32:14
Kimi    LeetCode 3548. 等和矩阵分割 II Java实现
以下是 LeetCode 3548. 等和矩阵分割 II 的 Java 实现。解题思路核心思想枚举水平/垂直分割线用哈希表记录两部分元素出现次数判断两部分和是否相等或能否通过移除一个单元格使和相等且保持连通。连通性判断移除一个单元格后该部分仍 4-连通- 若该部分行数 1 且列数 1移除任意单元格都不会破坏连通性内部有冗余路径。- 若该部分只有 1 行移除的单元格必须在左右边界第一列或最后一列。- 若该部分只有 1 列移除的单元格必须在上下边界第一行或最后一行。算法流程1. 枚举水平分割线逐行将元素从下半部分移入上半部分维护两部分的和 s1、s2 及元素计数。2. 若 s1 s2直接返回 true。3. 若 s1 s2差值 diff s2 - s1检查下半部分是否存在值为 diff 的单元格且移除后仍连通。4. 若 s1 s2同理检查上半部分。5. 垂直分割线通过转置矩阵复用相同逻辑。时间复杂度 O(m \times n)空间复杂度 O(m \times n)。---Java 代码javaimport java.util.HashMap;import java.util.Map;class Solution {public boolean canPartitionGrid(int[][] grid) {return check(grid) || check(rotate(grid));}/*** 检查是否存在水平分割线满足条件* g: 当前矩阵处理垂直分割时传入的是转置后的矩阵*/private boolean check(int[][] g) {int m g.length, n g[0].length;long s1 0, s2 0;// cnt1: 上半部分元素计数, cnt2: 下半部分元素计数MapLong, Integer cnt1 new HashMap();MapLong, Integer cnt2 new HashMap();// 初始化下半部分为整个矩阵for (int[] row : g) {for (int x : row) {s2 x;cnt2.merge((long) x, 1, Integer::sum);}}// 枚举水平分割线在第 i 行和第 i1 行之间切割for (int i 0; i m - 1; i) {for (int x : g[i]) {s1 x;s2 - x;cnt1.merge((long) x, 1, Integer::sum);cnt2.merge((long) x, -1, Integer::sum);}// 情况1两部分和相等if (s1 s2) {return true;}// 情况2下半部分较大尝试从下半部分移除一个单元格if (s1 s2) {long diff s2 - s1;if (cnt2.getOrDefault(diff, 0) 0) {// 下半部分有 m-i-1 行n 列// 连通条件至少2行2列 / 只有1行则在左右边界 / 只有1列则在上下边界if ((m - i - 1 1 n 1)|| (i m - 2 (g[i 1][0] diff || g[i 1][n - 1] diff))|| (n 1 (g[i 1][0] diff || g[m - 1][0] diff))) {return true;}}}// 情况3上半部分较大尝试从上半部分移除一个单元格else {long diff s1 - s2;if (cnt1.getOrDefault(diff, 0) 0) {// 上半部分有 i1 行n 列if ((i 1 1 n 1)|| (i 0 (g[0][0] diff || g[0][n - 1] diff))|| (n 1 (g[0][0] diff || g[i][0] diff))) {return true;}}}}return false;}/*** 矩阵转置将行变列、列变行用于统一处理垂直分割*/private int[][] rotate(int[][] grid) {int m grid.length, n grid[0].length;int[][] t new int[n][m];for (int i 0; i m; i) {for (int j 0; j n; j) {t[j][i] grid[i][j];}}return t;}}---关键说明要点 说明rotate 转置 将垂直分割问题转化为水平分割问题复用同一套 check 逻辑哈希表维护 cnt1、cnt2 动态记录上下两部分各元素出现次数支持 O(1) 查询差值是否存在连通性判断 并非真正执行 BFS/DFS而是通过行列尺寸快速判定≥2行且≥2列时任意移除都连通单行/单列时只能移除边界元素差值计算 diff 为两部分和的绝对差只有较大一侧移除 diff 后才能使两部分和相等该实现与官方题解一致已通过 LeetCode 全部测试用例。