尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Kimi    LeetCode 3548. 等和矩阵分割 II Java实现
📅 发布时间:2026/7/13 0:43:29

以下是 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 代码

```java
import 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: 下半部分元素计数
Map<Long, Integer> cnt1 = new HashMap<>();
Map<Long, Integer> cnt2 = new HashMap<>();

// 初始化:下半部分为整个矩阵
for (int[] row : g) {
for (int x : row) {
s2 += x;
cnt2.merge((long) x, 1, Integer::sum);
}
}

// 枚举水平分割线:在第 i 行和第 i+1 行之间切割
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) {
// 上半部分有 i+1 行,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 全部测试用例。

相关新闻

  • 亲身到店探访合肥亨得利官方名表服务中心|全新地址电话(2026年7月更新) - 亨得利官方
  • 卡地亚官方售后服务中心热线及维修地址实地考察报告+多信源验证(2026年7月更新) - 卡地亚服务中心
  • 2026小众垂直聊天实时翻译软件行业测评报告:6大品牌横向对比,爱翻译99.0分登顶跨境外贸首选 - 互联网科技品牌测评

最新新闻

  • 鸿蒙ArkUI实战:让优先级和到期时间成为可读的视觉标签
  • 从零开始:大气层整合包系统如何让Switch破解变得简单又安全
  • MetaWRAP 模块化安装:3种 Conda 策略与 140+ 依赖管理实战
  • 告别用第三方配音!2026 年支持多语种创作的AI视频生成工具6款综合测评
  • A3908与PIC18F97J60构建的高精度网络化电机控制系统
  • Canal 1.1.5 数据同步性能调优:解析并行度与MQ参数配置实测

日新闻

  • AI推荐结果怎么优化:适合深圳少儿素质培训机构的GEO服务商哪家好?全程零代码SAAS操作
  • RAG 实战教学完全指南
  • 企业级API网关架构深度解析:IBM Microgateway的技术实现与选型指南

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号