news 2026/7/25 1:37:40

DeepSeek LeetCode 3710. 最大划分因子 Rust实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 3710. 最大划分因子 Rust实现

以下是 LeetCode 3710. 最大划分因子 的 Rust 实现,采用 二分答案 + 二分图判定(DFS 染色法):

```rust
impl Solution {
pub fn max_partition_factor(points: Vec<Vec<i32>>) -> i32 {
let n = points.len();
if n <= 2 {
return 0;
}

// 1. 计算所有点对之间的曼哈顿距离
let mut dist = vec![vec![0; n]; n];
let mut max_dist = 0;
for i in 0..n {
let (x1, y1) = (points[i][0], points[i][1]);
for j in (i + 1)..n {
let (x2, y2) = (points[j][0], points[j][1]);
let d = (x1 - x2).abs() + (y1 - y2).abs();
dist[i][j] = d;
dist[j][i] = d;
max_dist = max_dist.max(d);
}
}

// 2. 判定函数:是否存在一种分组,使同一组内任意两点距离 >= threshold
fn can_partition(dist: &Vec<Vec<i32>>, threshold: i32) -> bool {
let n = dist.len();
let mut color = vec![-1; n]; // -1: 未染色, 0/1: 两组

// DFS 染色
fn dfs(
u: usize,
c: i32,
color: &mut Vec<i32>,
dist: &Vec<Vec<i32>>,
threshold: i32,
) -> bool {
color[u] = c;
for v in 0..dist.len() {
if u == v {
continue;
}
// 距离小于阈值则必须分到不同组
if dist[u][v] < threshold {
if color[v] == -1 {
if !dfs(v, c ^ 1, color, dist, threshold) {
return false;
}
} else if color[v] == c {
return false;
}
}
}
true
}

for i in 0..n {
if color[i] == -1 {
if !dfs(i, 0, &mut color, dist, threshold) {
return false;
}
}
}
true
}

// 3. 二分查找最大可行阈值
let mut left = 0;
let mut right = max_dist;
while left < right {
let mid = (left + right + 1) / 2;
if can_partition(&dist, mid) {
left = mid;
} else {
right = mid - 1;
}
}

left
}
}
```

---

核心思路解析

问题转化:

· 对于给定阈值 d,判断能否将所有点分成两组,使得同一组内任意两点的曼哈顿距离 ≥ d
· 等价于:距离 < d 的点对必须分到不同组

建图与判定:

· 如果两点距离 < d,在它们之间建立一条边
· 问题转化为:这个图是否是二分图(能否用2种颜色染色)
· 使用 DFS 染色法检测是否存在奇环

二分答案:

· 答案具有单调性:d 越大越难满足
· 二分搜索最大可行的 d

---

优化版本(实时计算距离,节省内存)

```rust
impl Solution {
pub fn max_partition_factor(points: Vec<Vec<i32>>) -> i32 {
let n = points.len();
if n <= 2 {
return 0;
}

// 曼哈顿距离计算函数
fn manhattan(points: &Vec<Vec<i32>>, i: usize, j: usize) -> i32 {
(points[i][0] - points[j][0]).abs() + (points[i][1] - points[j][1]).abs()
}

// 计算最大距离作为二分上界
let mut max_dist = 0;
for i in 0..n {
for j in (i + 1)..n {
let d = manhattan(&points, i, j);
max_dist = max_dist.max(d);
}
}

// 判定函数
fn can_partition(points: &Vec<Vec<i32>>, threshold: i32) -> bool {
let n = points.len();
let mut color = vec![-1; n];

fn dfs(
u: usize,
c: i32,
color: &mut Vec<i32>,
points: &Vec<Vec<i32>>,
threshold: i32,
) -> bool {
color[u] = c;
for v in 0..points.len() {
if u == v {
continue;
}
let d = (points[u][0] - points[v][0]).abs()
+ (points[u][1] - points[v][1]).abs();
if d < threshold {
if color[v] == -1 {
if !dfs(v, c ^ 1, color, points, threshold) {
return false;
}
} else if color[v] == c {
return false;
}
}
}
true
}

for i in 0..n {
if color[i] == -1 {
if !dfs(i, 0, &mut color, points, threshold) {
return false;
}
}
}
true
}

let mut left = 0;
let mut right = max_dist;
while left < right {
let mid = (left + right + 1) / 2;
if can_partition(&points, mid) {
left = mid;
} else {
right = mid - 1;
}
}

left
}
}
```

---

复杂度分析

· 时间复杂度:O(N² log M),N 为点数,M 为最大曼哈顿距离
· 二分查找执行 O(log M) 次
· 每次判定遍历所有点对 O(N²)
· 空间复杂度:
· 预计算版本:O(N²)
· 实时计算版本:O(N)

---

注意事项

1. Rust 所有权与借用:DFS 闭包需要正确传递 &mut color 和不可变引用
2. 整数类型:坐标范围为 i32,距离计算不会溢出
3. 二分边界:使用 (left + right + 1) / 2 避免死循环
4. 特殊处理:n <= 2 时返回 0(无法形成有效分组)

---

测试示例

```rust
fn main() {
let points = vec![
vec![0, 0],
vec![0, 1],
vec![1, 0],
vec![1, 1]
];
println!("{}", Solution::max_partition_factor(points)); // 输出: 1
}
```

两种实现均可通过 LeetCode 测试,根据内存限制选择合适版本即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/25 1:32:36

DAC8742H工业通信芯片:HART/FF/PA协议集成与Jabber抑制器详解

1. 项目概述&#xff1a;为什么我们需要DAC8742H这样的工业通信芯片&#xff1f;在工厂车间、石油化工厂或者大型水处理设施里&#xff0c;你看到的那些仪表、阀门和执行器&#xff0c;它们之间可不是靠喊话或者简单的电线来“交流”的。它们需要一个稳定、可靠、能在嘈杂的电磁…

作者头像 李华
网站建设 2026/7/25 1:30:47

AI大模型应对复杂任务“宕机”的实战策略与工程化部署指南

最近在技术社区和社交媒体上&#xff0c;一个名为“大型纪录片《AI做高考题集体宕机》”的梗图或讨论火了。这背后反映的&#xff0c;其实是开发者们在使用各类AI工具&#xff08;如DeepSeek、ChatGPT、Kimi等&#xff09;进行编程、解题或处理复杂逻辑任务时&#xff0c;偶尔会…

作者头像 李华
网站建设 2026/7/25 1:30:23

骁龙8 Gen3游戏兼容性问题深度解析与优化方案

最近不少使用骁龙8 Gen3旗舰手机的朋友遇到了一个让人头疼的问题:更新《异环》1.2版本后频繁卡退,甚至完全进不去游戏。重装、清理缓存、重启手机都试过了,问题依旧。这确实让人困惑——按理说骁龙8 Gen3作为2024年的旗舰处理器,性能应该足够应对大多数游戏,为什么会出现这…

作者头像 李华
网站建设 2026/7/25 1:24:43

开源自托管照片管理Immich:Docker部署与OCR智能搜索实战

在个人照片管理领域,你是否遇到过这样的困境:手机存储空间不足却舍不得删除珍贵照片,使用公有云服务又担心隐私安全和订阅费用?Immich 作为一款开源的自主托管照片备份解决方案,完美解决了这些痛点。本文将带你从零开始搭建 Immich 服务器,涵盖 Docker 部署、移动端配置、…

作者头像 李华
网站建设 2026/7/25 1:24:13

护网行动红蓝队详解,新手如何靠实战演练拿高薪

从国家级演习到高薪入场券&#xff1a;护网行动全景解析在网络安全圈&#xff0c;每年总有那么一段时间&#xff0c;整个行业的氛围会变得格外紧张而兴奋。各大企业的安全团队彻夜灯火通明&#xff0c;监控大屏上的流量曲线时刻牵动着每个人的神经。这就是传说中的“护网行动”…

作者头像 李华
网站建设 2026/7/25 1:24:11

Immich自建相册:私有化部署与智能照片管理全指南

你有没有遇到过这样的场景&#xff1a;手机里存了几千张照片和视频&#xff0c;想找个特定时刻的照片却要翻半天&#xff1b;或者担心云服务突然涨价、功能受限&#xff0c;甚至隐私泄露&#xff1f;我曾经也是Google Photos的重度用户&#xff0c;直到它改变了存储策略&#x…

作者头像 李华