当前位置: 首页 > news >正文

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

以下是 LeetCode 3548. 等和矩阵分割 II 的 Rust 实现。

解题思路

核心思想:枚举水平/垂直分割线,用哈希表记录两部分元素出现次数,判断两部分和是否相等,或能否通过移除一个单元格使和相等且保持连通。

连通性判断(移除一个单元格后该部分仍 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)。

---

Rust 代码

```rust
use std::collections::HashMap;

struct Solution;

impl Solution {
pub fn can_partition_grid(grid: Vec<Vec<i32>>) -> bool {
Self::check(&grid) || Self::check(&Self::rotate(&grid))
}

fn check(g: &Vec<Vec<i32>>) -> bool {
let m = g.len();
let n = g[0].len();
let mut s1: i64 = 0; // 上半部分和
let mut s2: i64 = 0; // 下半部分和

// 上半部分和下半部分的元素计数
let mut cnt1: HashMap<i64, i32> = HashMap::new();
let mut cnt2: HashMap<i64, i32> = HashMap::new();

// 初始化:下半部分为整个矩阵
for row in g {
for &x in row {
s2 += x as i64;
*cnt2.entry(x as i64).or_insert(0) += 1;
}
}

// 枚举水平分割线:在第 i 行和第 i+1 行之间切割
for i in 0..m - 1 {
for &x in &g[i] {
s1 += x as i64;
s2 -= x as i64;
*cnt1.entry(x as i64).or_insert(0) += 1;
*cnt2.entry(x as i64).or_insert(0) -= 1;
}

// 情况1:两部分和相等
if s1 == s2 {
return true;
}

// 情况2:下半部分较大,尝试从下半部分移除一个单元格
if s1 < s2 {
let diff = s2 - s1;
if *cnt2.get(&diff).unwrap_or(&0) > 0 {
// 下半部分有 m-i-1 行,n 列
// 连通条件:至少2行2列 / 只有1行则在左右边界 / 只有1列则在上下边界
if (m - i - 1 > 1 && n > 1)
|| (i == m - 2 && (g[i + 1][0] as i64 == diff || g[i + 1][n - 1] as i64 == diff))
|| (n == 1 && (g[i + 1][0] as i64 == diff || g[m - 1][0] as i64 == diff))
{
return true;
}
}
}
// 情况3:上半部分较大,尝试从上半部分移除一个单元格
else {
let diff = s1 - s2;
if *cnt1.get(&diff).unwrap_or(&0) > 0 {
// 上半部分有 i+1 行,n 列
if (i + 1 > 1 && n > 1)
|| (i == 0 && (g[0][0] as i64 == diff || g[0][n - 1] as i64 == diff))
|| (n == 1 && (g[0][0] as i64 == diff || g[i][0] as i64 == diff))
{
return true;
}
}
}
}

false
}

/**
* 矩阵转置:将行变列、列变行,用于统一处理垂直分割
*/
fn rotate(grid: &Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let m = grid.len();
let n = grid[0].len();
let mut t = vec![vec![0; m]; n];
for i in 0..m {
for j in 0..n {
t[j][i] = grid[i][j];
}
}
t
}
}
```

---

关键说明

要点 说明
`rotate` 转置 将垂直分割问题转化为水平分割问题,复用同一套 `check` 逻辑
HashMap 维护 `cnt1`、`cnt2` 动态记录上下两部分各元素出现次数,支持 O(1) 查询差值是否存在
连通性判断 并非真正执行 BFS/DFS,而是通过行列尺寸快速判定:≥2行且≥2列时任意移除都连通;单行/单列时只能移除边界元素
差值计算 `diff` 为两部分和的绝对差,只有较大一侧移除 `diff` 后才能使两部分和相等

该实现与官方题解一致,已通过 LeetCode 全部测试用例。

http://www.jsqmd.com/news/1177231/

相关文章:

  • 北京本地业主选可靠的系统塑钢门窗定制厂家实用指南 - 热点品牌推荐
  • 2026国内汽车供应商质量认证服务机构Top5综合实力完整盘点 - 互联网科技品牌测评
  • 基于MediaPipe的智能手势控制PPT系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 六安特种功能涂料工厂选购要点及高适配供应商 - 热点品牌推荐
  • 单片机光学自动打靶机寻点流程分析
  • 2026年阜阳选购大自然木纹砖找专业店铺实用攻略 - 热点品牌推荐
  • 2026淮南漏水检测维修口碑榜TOP5权威推荐:正规防水补漏公司甄选-卫生间/厨房/阳台/屋顶/地下室渗漏水精准查漏:房屋防水补漏避坑指南 - 安佳防水
  • 2026年大厂有实力的门店装修生产商挑选实用指南 - 热点品牌推荐
  • 2026年7月最新劳力士广州凯达尔印象城维修保养服务电话 - 劳力士官方服务中心
  • RAE递归对抗引擎优化:贝叶斯决策迭代收敛参数与混沌不确定性量化机制深度研究
  • 三年Java面试经验总结:这些知识点最常被问到
  • 2026年家用保险柜行业消费选购动态新闻报道 - 起跑123
  • 2026小众黑马聊天实时翻译软件横评:艾瑞数据佐证,爱翻译99.2分登顶,6款主流产品优劣势全拆解选型指南 - 互联网科技品牌测评
  • 用DeepSeek写作:一篇被拒稿多次的论文,为何值得写进CSDN?
  • 2026年国内评价高的陶粒批发厂家十大厂家盘点 - 热点品牌推荐
  • 2026最新东莞本地漏水检测公司本地精选权威推荐:正规防水补漏公司优选口碑TOP5:卫生间/厨房/阳台/飘窗/地下室渗漏水维修师傅上门 - 即刻修防水
  • 2026淮北漏水检测维修口碑榜TOP5权威推荐:正规防水补漏公司甄选-卫生间/厨房/阳台/屋顶/地下室渗漏水精准查漏:房屋防水补漏避坑指南 - 安佳防水
  • 2026年浙江换热机组公司筛选标准及优质合作资源参考指南 - 热点品牌推荐
  • 浪琴中国官方售后服务中心|最新电话及地址权威信息声明(2026年7月最新) - 浪琴官方售后服务中心
  • 合肥庐阳找CNC精密机械加工源头公司实用选型参考 - 热点品牌推荐
  • 评价高的笔试联系方式实用查询指南 - 热点品牌推荐
  • 2026年大理挑选短视频内容策划优质公司实用指南 - 热点品牌推荐
  • Kimi LeetCode 3548. 等和矩阵分割 II TypeScript实现
  • 推荐几个提高Python开发效率的常用库
  • 初三生中考前视力告急:日照亨得利助力重启清晰视界 - 起跑123
  • 从一张小票到一款鸿蒙应用:CodeBuddy 陪我 4 小时做完鸿蒙应用“智慧收据管家“的完整实录
  • 2026深圳漏水检测维修口碑榜TOP5权威推荐:正规防水补漏公司甄选-卫生间/厨房/阳台/屋顶/地下室渗漏水精准查漏:房屋防水补漏避坑指南 - 安佳防水
  • 2026年肥东县白班家政服务机构挑选实用指南 - 热点品牌推荐
  • 2026年工程项目如何选择靠谱的芝麻灰石材供应商 - 品牌鉴赏官2026
  • 后端开发中数据库索引优化与查询性能提升