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

DeepSeek LeetCode 3830. 移除至多一个元素后的最长交替子数组 Rust实现

针对 LeetCode 3830“移除至多一个元素后的最长交替子数组”,这里提供 Rust 实现,采用 动态规划 (O(n) 时间, O(1) 空间),代码高效且安全。

---

核心思路

维护 4 个状态(以当前元素结尾):

· inc0:最后一段比较为 上升 (<),未删除元素
· dec0:最后一段比较为 下降 (>),未删除元素
· inc1:最后一段比较为 上升,已删除一个元素
· dec1:最后一段比较为 下降,已删除一个元素

每个状态初始为 1(仅包含当前元素本身)。

转移(遍历 i 从 1 到 n-1):

1. 正常延续(不删除 i-1):
· 若 nums[i] > nums[i-1]:
inc0 = dec0_prev + 1,inc1 = dec1_prev + 1
· 若 nums[i] < nums[i-1]:
dec0 = inc0_prev + 1,dec1 = inc1_prev + 1
2. 删除 i-1(使用一次删除机会):需 i >= 2,比较 nums[i] 与 nums[i-2]:
· 若 nums[i] > nums[i-2]:inc1 = max(inc1, dec0_prev2 + 1)
· 若 nums[i] < nums[i-2]:dec1 = max(dec1, inc0_prev2 + 1)
3. 每个状态至少为 1(重新开始)。

---

Rust 代码实现

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

// 初始状态(以 nums[0] 结尾)
let (mut inc0, mut dec0) = (1, 1);
let (mut inc1, mut dec1) = (1, 1);
let mut ans = 1;

// 保存 i-2 时的未删除状态(初始不存在,设为 0)
let (mut inc0_prev2, mut dec0_prev2) = (0, 0);

for i in 1..n {
// 保存当前状态,作为下一轮迭代的 prev2
let (next_inc0, next_dec0) = (inc0, dec0);

// 保存上一轮状态(prev1)
let (prev_inc0, prev_dec0) = (inc0, dec0);
let (prev_inc1, prev_dec1) = (inc1, dec1);

// 重置当前状态(至少为 1)
inc0 = 1;
dec0 = 1;
inc1 = 1;
dec1 = 1;

// ---- 正常延续(不删除 i-1) ----
if nums[i] > nums[i - 1] {
inc0 = inc0.max(prev_dec0 + 1);
inc1 = inc1.max(prev_dec1 + 1);
} else if nums[i] < nums[i - 1] {
dec0 = dec0.max(prev_inc0 + 1);
dec1 = dec1.max(prev_inc1 + 1);
}

// ---- 删除 i-1(跳过中间元素) ----
if i >= 2 {
if nums[i] > nums[i - 2] {
inc1 = inc1.max(dec0_prev2 + 1);
} else if nums[i] < nums[i - 2] {
dec1 = dec1.max(inc0_prev2 + 1);
}
}

// 更新全局最大值
ans = ans.max(inc0).max(dec0).max(inc1).max(dec1);

// 更新 i-2 状态为旧的 i-1 状态(即本次迭代前的 inc0/dec0)
inc0_prev2 = next_inc0;
dec0_prev2 = next_dec0;
}

ans as i32
}
}
```

---

复杂度分析

· 时间复杂度:O(n),单次遍历。
· 空间复杂度:O(1),仅使用常数个变量。

---

测试用例(可自行添加)

```rust
fn main() {
let sol = Solution;
assert_eq!(sol.longest_alternating(vec![1, 2, 3, 4]), 2);
assert_eq!(sol.longest_alternating(vec![1, 3, 2, 4]), 4); // 不删除即满足
assert_eq!(sol.longest_alternating(vec![1, 2, 1, 3, 2]), 5); // 删除一个元素后可达
assert_eq!(sol.longest_alternating(vec![1, 1, 1]), 1);
assert_eq!(sol.longest_alternating(vec![1, 2]), 2);
}
```

该实现直接对应 LeetCode 的 Rust 模板,可直接提交使用。如需进一步解释,欢迎追问!

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

相关文章:

  • 拯救者笔记本终极性能调校工具:Lenovo Legion Toolkit完全指南
  • 希捷Exos 32TB企业级硬盘深度评测与性能分析
  • Python农产品智能销售系统:预测与可视化实践
  • 小红书内容采集终极指南:从零开始掌握高效下载的完整教程
  • 兰州本地防水补漏怎么选?屋顶卫生间外墙地下室阳台渗水检测大盘点(2026年8月新) - 北京金修达天津维修部
  • AI Agent技能开发实战:从文件操作到API集成的核心技能解析
  • 2026年性价比高的可拼接浮筒厂家推荐指南:从实心浮筒到组合平台的择优与严选盘点 - geo交流
  • 保险行业客户体验管理系统推荐:基于客户旅程地图(CJM)的保险全旅程体验监测与理赔情绪干预引擎设计
  • [光学原理与应用-974]:WS2812B 通信协议 RGB 灯条原理
  • Unity集成Newtonsoft.Json全攻略:从安装配置到性能优化
  • UAssetGUI企业级虚幻引擎资产编辑架构深度解析:性能优化与最佳实践指南
  • 汽车维修保养避坑干货:透明养护才是车主安心之选 - 国麟测评
  • Google与GitHub高级搜索技巧及自动化资产监控实践
  • Electron桌面应用开发实战:从零构建跨平台客户端
  • 数字IC/FPGA工程师简历优化指南:从ATS筛选到面试引导
  • NVIDIA Profile Inspector深度指南:解锁显卡200+隐藏设置的终极工具
  • 2026年选全自动糊箱机源头厂家哪家可靠 元鼎包装机械 - 热点品牌推荐
  • 灌装封尾机厂家实力解析:2026年制药与日化行业产线升级的关键抉择 - 优企名品
  • 2026年只见智能穿戴设备有哪些合作优势?这份优选盘点给你答案 - geo交流
  • Cloudflare全栈应用部署实战:从域名到容器化托管一站式指南
  • WASM:连接云原生与区块链的通用运行时技术解析
  • 2026深圳口碑搬家公司大盘点:靠谱服务商推荐 避坑全指南FAQ 附多场景适配方案 - 深圳家顺兴搬家
  • 算法面试复盘工具的设计与实现
  • Electron应用主题定制全攻略:从解包到CSS修改实战
  • AI Agent与CLI融合:构建稳定可控的自动化运维助手
  • Linux下HTTP协议与网络编程实战指南
  • 2026年窑鸡赛道持续升温,窑鸡大王加盟模式如何以轻资产撬动高复购? - 优质品牌商家
  • 2026年制氮机源头厂家实力之选:宏骁智能装备科技江苏有限公司专注高纯PSA制氮与脱碳集成解决方案 - 卓企推荐
  • 阿里云DataWorks全链路解析:从数据集成到服务化,构建企业级数据中台
  • 星盘接口开发文档:周运语料接口指南