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

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 测试,根据内存限制选择合适版本即可。

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

相关文章:

  • 使用pymodbus实现Modbus TLS加密通信:从证书生成到生产部署
  • 29-主题选择与安装-找到你的审美
  • 芜湖本地防水补漏精选TOP5推荐:正规漏水检测维修公司上门师傅推荐:厕所/棚顶/屋面/飘窗/阳台/地下室/厨房渗漏水精准测漏维修(2026最新) - 即刻修防水
  • 2026芜湖漏水检测维修本地口碑榜TOP5权威推荐-专业仪器精准测漏-正规防水补漏公司推荐:卫生间/厨房/屋顶/阳台/外墙渗漏水检测师傅上门 - 安佳防水
  • 如何快速创建个性化桌面宠物:DyberPet开源框架完全指南
  • 2026类似于OpenClaw的定制化系统有哪些?高性价比OpenClaw替代方案商测评
  • 腾讯混元3D 2.0+ComfyUI:单图生成3D模型的低门槛实战指南
  • 防爆布控球在皮带运输系统中的智能预警技术
  • 终极指南:5分钟掌握中兴光猫工厂模式解锁与远程调试
  • Ultralytics:解读Proto模块
  • 3分钟学会:如何用Chrome扩展一键保存完整长网页截图
  • Zotero PDF Translate:20+翻译引擎的学术翻译利器
  • C++20 std::span与原生指针转换:跨平台兼容性实战指南
  • 2026年哪家无人机培训机构可以考证?最新排行榜出炉 - 品牌排行榜
  • 射频采样ADC32RF44:从核心原理到硬件设计的工程实践指南
  • ExifToolGui:免费开源的照片元数据管理神器,轻松管理你的数字记忆
  • 北京离婚谈判律师:为你的婚姻纠纷保驾护航 - 品牌排行榜
  • 跨越天际:从智能汽车到 eVTOL 的适航与系统级开发53——商业化运营(运营人审定、持续适航维修管理规章)的最后一公里落地指南
  • 计算机毕业设计之django基于python的毕业生就业信息系统
  • Unity集成WebRTC构建低延迟远程监控系统原型实战
  • esp32开发与应用(边采样边播放音频)
  • TAS3251音频DSP寄存器配置实战:CRC/XOR校验与时钟树详解
  • STM32定时器输入捕获实现精确频率测量的原理与实战
  • java: Backtracking Algorithm
  • 2026 年新消息:湛江值得关注的清理化粪池服务商深度剖析,别再等!化粪池堵塞的致命信号你必须知道 - 企业官方推荐【认证】
  • 张高兴的 Hailo-10 开发指南:(二)使用 LangChain 搭建本地大模型 RAG 问答应用
  • CloudWatch 日志保留策略自动化:全账号 200+ 日志组统一 7 天,月省 $3000
  • 技术简历制作全攻略:Word/LaTeX/Markdown模板与ATS优化技巧
  • 北京办理中国到肯尼亚签证正规代办旅行社服务指南 - 品牌优推
  • 2026 年 7 月新发布:绥德专业的岩棉板供货厂家怎么联系,冬天保暖的秘密:别再用传统材料了-龙飒岩棉保温棉 - 品质体验官