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

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

针对 LeetCode 3830“移除至多一个元素后的最长交替子数组”,这里提供 JavaScript (ES6+) 实现,采用 动态规划 (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(重新开始)。

---

JavaScript 代码

```javascript
/**
* @param {number[]} nums
* @return {number}
*/
var longestAlternating = function(nums) {
const n = nums.length;
if (n === 0) return 0;

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

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

for (let i = 1; i < n; i++) {
// 保存当前状态,作为下一轮迭代的 i-2
const next_inc0 = inc0, next_dec0 = dec0;

// 保存上一轮状态(i-1)
const prev_inc0 = inc0, prev_dec0 = dec0;
const prev_inc1 = inc1, prev_dec1 = dec1;

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

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

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

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

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

return ans;
};
```

---

复杂度分析

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

---

测试用例

```javascript
console.log(longestAlternating([1,2,3,4])); // 2
console.log(longestAlternating([1,3,2,4])); // 4
console.log(longestAlternating([1,2,1,3,2])); // 5
console.log(longestAlternating([1,1,1])); // 1
console.log(longestAlternating([1,2])); // 2
```

---

如果需要更直观的解法,也可以使用前后缀分解,但 DP 解法空间更优。以上代码可直接提交到 LeetCode。

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

相关文章:

  • 2026石家庄专业的喷泉施工加工厂甄选指南:三招教你避开施工陷阱,选对靠谱厂家 - geo交流
  • 数据转换指令实战指南:从基础类型到JSON序列化的高效处理
  • 2026深圳搬家公司避坑指南+正规资质大盘点 选对靠谱服务商的全维度攻略FAQ - 深圳家顺兴搬家
  • 商品数据向量化:自定义向量函数适配向量数据库检索需求
  • 普利姆算法:从原理到实现,解决最小生成树问题的贪心策略
  • 大模型应用优化:基于信息瓶颈的上下文向量工程实践
  • 旧iPhone降级越狱终极指南:如何用Legacy iOS Kit让你的老设备重获新生
  • 2026年河南太阳能供电电动球阀实力厂商优选指南:怎么联系最靠谱? - geo交流
  • Day03-系统设计总览
  • 2026年电赛——K230 无线图传系统技术分析
  • 3C电子|精密光学模切MES实施落地:卷材追溯、模具管控、无尘车间数字化落地技术方案
  • 华为B6手环耳机屏幕维修全攻略:从诊断到避坑的实用指南
  • AI多Agent协作系统实战(三十三):AI被一张截图噎住了:纯文本模型的Session里,不该有图片
  • 芜湖下水道堵塞、反水反臭不用慌!各类管道故障成因,解决办法一次性讲全 - 宅安选房屋修缮
  • 如何用NVIDIA Profile Inspector实现终极显卡性能优化
  • 怀化本地防水补漏哪家专业?屋顶、卫生间、外墙、地下室、阳台漏水师傅测评(2026年8月新) - 北京金修达天津维修部
  • 基于LangChain为DeepSeek构建三层记忆系统:从对话连贯到知识增强
  • 从Prompt到系统:AI Agent管理范式的演进与工程实践
  • 吃了40年的兰州拉面,居然是青海人开的?如今集体改名,背后的大战比电视剧还精彩
  • 检修明纬S-500-24V开关电源实例
  • 代谢激素多因子同步定量破局——GCG/ GHRL/GLP1/IAPP/INS/LEP/NPY/OX/PYY九联Panel开辟能量调控研究新方法
  • 2026深圳家庭企业搬家口碑公司怎么选?合规实力amp;多场景适配盘点+避坑FAQ全指南 - 深圳家顺兴搬家
  • AI 观测站|AI 开始让传统运维解释不了问题
  • 银川下水道堵塞、反水反臭不用慌!各类管道故障成因,解决办法一次性讲全 - 宅安选房屋修缮
  • Spring Boot高并发下集合操作引发的NullPointerException排查与修复
  • 深度解锁NVIDIA显卡隐藏设置:NVIDIA Profile Inspector完全配置指南
  • 项目里程碑如何设置才合理?从关键节点、成果标准到验收确认,一文讲透
  • Godot富文本增强:打字机效果与自定义BBCode实现详解
  • 2026年找糊箱机供应商哪家靠谱?看这里了解元鼎包装机械 - 热点品牌推荐
  • MySQL单表数据量管理与性能优化实战