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

Kimi LeetCode 3382. 用点构造面积最大的矩形 II Rust实现

以下是 LeetCode 3382. 用点构造面积最大的矩形 II 的 Rust 实现:

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

struct SegmentTree {
n: usize,
tree: Vec<i32>,
}

impl SegmentTree {
fn new(n: usize) -> Self {
SegmentTree {
n,
tree: vec![-1; 2 * n],
}
}

fn update(&mut self, idx: usize, val: i32) {
let mut i = idx + self.n;
self.tree[i] = val;
while i > 1 {
i >>= 1;
self.tree[i] = self.tree[i << 1].max(self.tree[(i << 1) | 1]);
}
}

fn query(&self, idx: usize) -> i32 {
self.tree[idx + self.n]
}

fn query_range(&self, mut l: usize, mut r: usize) -> i32 {
if l > r {
return -1;
}
l += self.n;
r += self.n;
let mut res = -1;
while l <= r {
if l & 1 == 1 {
res = res.max(self.tree[l]);
l += 1;
}
if r & 1 == 0 {
res = res.max(self.tree[r]);
r -= 1;
}
l >>= 1;
r >>= 1;
}
res
}
}

impl Solution {
pub fn max_rectangle_area(x_coord: Vec<i32>, y_coord: Vec<i32>) -> i64 {
let n = x_coord.len();
let mut points: Vec<(i32, i32)> = x_coord.into_iter()
.zip(y_coord.into_iter())
.collect();
points.sort_unstable();

// y 坐标离散化
let mut ys: Vec<i32> = points.iter().map(|&(_, y)| y).collect();
ys.sort_unstable();
ys.dedup();
let m = ys.len();

let mut y_to_idx: HashMap<i32, usize> = HashMap::with_capacity(m);
for (i, &y) in ys.iter().enumerate() {
y_to_idx.insert(y, i);
}

let mut seg = SegmentTree::new(m);
let mut ans: i64 = -1;

for i in 0..n - 1 {
let y1 = points[i].1;
let y1_idx = *y_to_idx.get(&y1).unwrap();

// 相邻两点 x 相同,可能构成矩形右侧边
if points[i].0 == points[i + 1].0 {
let y2 = points[i + 1].1;
let y2_idx = *y_to_idx.get(&y2).unwrap();

let x1 = seg.query(y1_idx);
let x2 = seg.query(y2_idx);

// 左侧两个顶点的 x 坐标必须相同
if x1 != -1 && x2 != -1 && x1 == x2 {
let area = (y2 as i64 - y1 as i64) * (points[i].0 as i64 - x1 as i64);
// 检查矩形内部是否无其他点
if y2_idx - y1_idx <= 1 || seg.query_range(y1_idx + 1, y2_idx - 1) < x1 {
ans = ans.max(area);
}
}
}

// 将当前点加入线段树
seg.update(y1_idx, points[i].0);
}

ans
}
}
```

关键点说明

要点 说明
离散化 用 `HashMap` 将 y 坐标映射到 0m-1 的索引
线段树 迭代式实现(数组下标从 n 开始),维护每个 y 上已处理点的最大 x
扫描顺序 按 x 排序后从小到大扫描,保证已处理点都在当前点左侧
面积类型 使用 `i64` 避免乘法溢出
矩形验证 `query_range(y1+1, y2-1) < x1` 确保内部无点

复杂度

- 时间:O(n \log n)(排序 + 线段树操作)
- 空间:O(n)(离散化 + 线段树)

http://www.cnnetsun.cn/news/3018737.html

相关文章:

  • 大模型幻觉防控四步法:从提示工程到人机协同实战指南
  • YOLO 部署到边缘设备:从 .pt 到 ONNX/TensorRT 全链路实战
  • GTA5线上小助手:3步轻松解锁终极游戏体验的完整指南
  • 黑色星期五折扣汇总:一个帮你省钱的开源项目
  • 从单核到多核异构:解析高性能嵌入式处理器架构与P5系列开发实战
  • 基于DPAA的USDPAA IPSecfwd:嵌入式Linux高性能IPSec转发实践
  • 终极解决方案:3步搞定Zotero中文文献识别难题的完整指南
  • 图的正负p-能量:从谱理论到3-能量下界证明
  • 终极指南:3步轻松安装HS2-HF Patch,打造完美HoneySelect2游戏体验
  • JenNet-IP协议栈:从6LoWPAN到MIB管理的物联网IP化通信实践
  • 2-伴随:连接高阶范畴与序结构的表示理论桥梁
  • 深度剖析Krita AI Diffusion:开源数字绘画与AI生成的无缝融合架构
  • 昆明市安宁市私人保镖在哪找比较靠谱
  • vSphere迁移史诗级避雷清单(含vMotion失败率TOP5原因):金融级生产环境验证的17项预检Checklist
  • 凸优化加速算法:原始对偶平均方法与精度证书的工程实践
  • AI智能体分类及其应用解析(3)
  • 半导体巨头ESG实践:从芯片设计到绿色制造的可持续竞争力
  • RDP Wrapper:让Windows桌面版变身多用户服务器的魔法工具
  • 四维流形连通和上的Weyl能量极小化与Bach平坦度量研究
  • 嵌入式系统PLL时钟配置:从原理到56852实战避坑指南
  • 【限时解锁】ESXi 8.0U2安装秘钥包:含ESXi-Boot-ISO定制工具、RAID驱动注入教程及HPE Gen10+固件补丁集
  • MCU硬件断点与实时追踪:S08DBGV3调试模块实战解析
  • ThinkPHP where方法SQL注入漏洞分析与复现:从表达式查询到exp利用
  • CSDN绕过multiPlatform发布
  • 深入解析ColdFire硬件调试模块:从硬件断点原理到BDM通信实战
  • LPC315x LCD FIFO与I2C控制器实战:从硬件原理到驱动优化
  • 如何优雅地离线收藏B站优质内容:BilibiliVideoDownload完全指南
  • auri 2 + React 19 实战:如何用AI从零构建一个极致轻量的Markdown阅读器
  • 深入解析SMC UART模式:缓冲区描述符机制与高效串行通信实现
  • MPC8560 ATM控制器缓冲区描述符与中断队列机制详解