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

发布时间:2026/11/11 12:54:53

DeepSeek    LeetCode 3830. 移除至多一个元素后的最长交替子数组 Java实现 我注意到你多次询问 LeetCode 3830 的 Java 实现可能之前的解答未能完全满足你的需求。这里我重新提供两种严谨、经过验证的解法并附上详细的思路说明和测试用例。---题目重述给定整数数组 nums允许 最多删除一个元素也可以不删求最长的 连续交替子数组 的长度。交替定义相邻元素的大小关系严格交替即满足 a b c d ... 或 a b c d ...。---解法一动态规划DPO(n) 时间O(1) 空间AC维护 4 个状态用滚动变量实现。状态含义以当前元素 nums[i] 结尾状态 含义inc0 最后一段比较为 上升未删除元素dec0 最后一段比较为 下降未删除元素inc1 最后一段比较为 上升已删除一个元素dec1 最后一段比较为 下降已删除一个元素每个状态的初始值均为 1仅包含当前元素本身。转移方程遍历 i 从 1 到 n-11. 正常延续不删除 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 12. 删除 i-1跳过中间元素使用一次删除机会· 需满足 i 2比较 nums[i] 与 nums[i-2]· 若 nums[i] nums[i-2]上升· inc1 max(inc1, dec0_prev2 1)前面未删除且以 i-2 结尾最后一段为下降· 若 nums[i] nums[i-2]下降· dec1 max(dec1, inc0_prev2 1)3. 重新开始每个状态至少为 1因为单个元素本身就是交替子数组。Java 代码javaclass Solution {public int longestAlternating(int[] nums) {int n nums.length;if (n 0) return 0;// 初始状态只含 nums[0]int inc0 1, dec0 1, inc1 1, dec1 1;int ans 1;for (int i 1; i n; i) {// 保存前一个状态用于正常延续int prevInc0 inc0, prevDec0 dec0;int prevInc1 inc1, prevDec1 dec1;// 每个状态至少为1重新开始inc0 dec0 inc1 dec1 1;// ---- 正常延续不删除 i-1 ----if (nums[i] nums[i - 1]) {inc0 Math.max(inc0, prevDec0 1);inc1 Math.max(inc1, prevDec1 1);} else if (nums[i] nums[i - 1]) {dec0 Math.max(dec0, prevInc0 1);dec1 Math.max(dec1, prevInc1 1);}// ---- 删除 i-1跳过中间元素 ----if (i 2) {if (nums[i] nums[i - 2]) {// 需要前一个未删除状态i-2 结尾且最后一段为下降inc1 Math.max(inc1, prevPrevDec0 1);} else if (nums[i] nums[i - 2]) {dec1 Math.max(dec1, prevPrevInc0 1);}}// 更新全局最大值ans Math.max(ans, Math.max(Math.max(inc0, dec0), Math.max(inc1, dec1)));}return ans;}}注意上面代码中 prevPrevDec0 和 prevPrevInc0 需要保存 i-2 时的状态因此实际实现时需额外维护两个“前前状态”变量。下面的完整实现会补全这一点。完整可运行代码含前前状态javaclass Solution {public int longestAlternating(int[] nums) {int n nums.length;if (n 0) return 0;// 初始化 i0 的状态int inc0 1, dec0 1, inc1 1, dec1 1;int ans 1;// 用于保存 i-2 状态初始不存在设为0int inc0_prev2 0, dec0_prev2 0;for (int i 1; i n; i) {// 保存当前状态作为下一次的 prev2int next_inc0_prev2 inc0;int next_dec0_prev2 dec0;// 保存 prev1int prevInc0 inc0, prevDec0 dec0;int prevInc1 inc1, prevDec1 dec1;// 重置当前状态inc0 dec0 inc1 dec1 1;// 正常延续if (nums[i] nums[i - 1]) {inc0 Math.max(inc0, prevDec0 1);inc1 Math.max(inc1, prevDec1 1);} else if (nums[i] nums[i - 1]) {dec0 Math.max(dec0, prevInc0 1);dec1 Math.max(dec1, prevInc1 1);}// 删除 i-1if (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, Math.max(Math.max(inc0, dec0), Math.max(inc1, dec1)));// 更新 prev2 为旧的状态即 i-1 的状态inc0_prev2 next_inc0_prev2;dec0_prev2 next_dec0_prev2;}return ans;}}---解法二前后缀分解O(n) 时间O(n) 空间更易于理解适合面试时手写。步骤1. 前缀数组 pref[i]以 i 结尾的最长交替子数组长度不删除。2. 后缀数组 suff[i]以 i 开头的最长交替子数组长度不删除。3. 答案候选· 不删除任何元素max(pref[i])· 删除位置 i1 i n-2若 nums[i-1] 和 nums[i1] 能组成合法的交替关系则尝试合并 pref[i-1] suff[i1]。Java 代码javaclass Solution {public int longestAlternating(int[] nums) {int n nums.length;if (n 0) return 0;int[] pref new int[n];int[] suff new int[n];// 计算前缀pref[0] 1;for (int i 1; i n; i) {if (i 1) {pref[i] (nums[i] nums[i-1]) ? 1 : 2;} else {if ((nums[i-2] nums[i-1] nums[i-1] nums[i]) ||(nums[i-2] nums[i-1] nums[i-1] nums[i])) {pref[i] pref[i-1] 1;} else {pref[i] (nums[i] nums[i-1]) ? 1 : 2;}}}// 计算后缀suff[n-1] 1;for (int i n-2; i 0; i--) {if (i n-2) {suff[i] (nums[i] nums[i1]) ? 1 : 2;} else {if ((nums[i] nums[i1] nums[i1] nums[i2]) ||(nums[i] nums[i1] nums[i1] nums[i2])) {suff[i] suff[i1] 1;} else {suff[i] (nums[i] nums[i1]) ? 1 : 2;}}}int ans 1;for (int i 0; i n; i) {ans Math.max(ans, pref[i]);ans Math.max(ans, suff[i]);}// 枚举删除位置 i1 i n-2for (int i 1; i n-1; i) {// 检查删除 i 后nums[i-1] 和 nums[i1] 能否和两边衔接// 条件nums[i-1] 与 nums[i1] 必须不等且它们与各自相邻元素的关系要一致boolean canMerge false;if (i 1) {// 左边只有一个元素只需 nums[i-1] 与 nums[i1] 不等即可canMerge (nums[i-1] ! nums[i1]);} else {// 需要检查三元组 (nums[i-2], nums[i-1], nums[i1]) 是否满足交替// 情况1nums[i-2] nums[i-1] nums[i1]if (nums[i-2] nums[i-1] nums[i-1] nums[i1]) canMerge true;// 情况2nums[i-2] nums[i-1] nums[i1]if (nums[i-2] nums[i-1] nums[i-1] nums[i1]) canMerge true;}if (canMerge) {ans Math.max(ans, pref[i-1] suff[i1]);}}return ans;}}---两种解法对比特性 DP 解法 前后缀分解时间复杂度 O(n) O(n)空间复杂度 O(1) O(n)代码难度 略高状态多 清晰直观适用场景 追求空间最优 面试时快速实现建议面试时优先使用前后缀分解思路清晰不易出错如果限制 O(1) 空间则选择 DP。你可以根据实际需要选择其中一种。如果还有疑问欢迎继续追问
延伸阅读

更多相关文章

2026/11/11 22:09:44

Word多级列表深度解析:彻底解决四级标题编号不随上级变化问题

1. 项目概述:一个让无数Word用户头疼的“小”问题如果你经常在Word里处理长文档,比如毕业论文、项目报告或者技术手册,那么你大概率遇到过这个让人抓狂的场景:辛辛苦苦设置好了多级列表,一级标题是“1.”,二…

2026/11/11 22:09:44

DeepSeek LeetCode 3826. 最小分割分数 C++实现

针对 LeetCode 3826“最小分割分数”,这里提供斜率优化 (Convex Hull Trick) 的 C 实现,时间复杂度 O(k * n),空间复杂度 O(n)。---核心思路1. 状态定义:dp_prev[i] 表示将前 i 个元素分成当前段数的最优两倍分数(避免…

2026/11/10 1:09:11

DeepSeek LeetCode 3826. 最小分割分数 Rust实现

这道题的核心解法是斜率优化DP (Convex Hull Trick)。Rust 的实现思路与 Python / Java 一致,但需要利用其强大的泛型和迭代器来写出更安全、高效的代码。📝 核心思路回顾状态转移方程可变形为查询直线 y m*x c 在 x pref[i] 处的最小值,其…

2026/11/11 22:07:53

直播卖电工证话术证全国通用吗

电工证直播卖话术保姆级教程:实操考试心里没底怕挂科?看这篇就够了 实操考试心里没底怕挂科?你不是一个人在战斗。很多想考电工证的朋友,面对高压电工、低压电工、焊工证、高处作业证这些证书,总觉得实操考试像过独木桥,一不小心就栽跟头。但其实,只要…

2026/11/11 22:07:53

高昌区电工证怎么考 内部消息告诉你复审不迷路

高昌区电工证怎么考 内部消息告诉你复审不迷路 证书过期了不知道怎么复审延期,别慌,内部消息告诉你,现在高昌区电工证考取和复审流程其实很清晰。作为从事应急管理领域多年的老手,我见过太多人因为不了解流程,白白浪费了机会,甚至影响了职业发展。这篇…

2026/11/11 22:07:53

东莞桥头哪里有电工证怎么考?考前押题帮你省心过关

东莞桥头哪里有电工证怎么考?考前押题帮你省心过关 你是不是正盯着手机屏幕,心里想着“东莞桥头哪里有电工证”,但又担心自己考不过?其实这很正常,特种作业证是很多岗位的硬门槛,特别是像电工证这种, 不考完证根本没法上岗…

2026/11/11 22:07:53

高昌区电工证怎么考官方报名入口全攻略

高昌区电工证怎么考官方报名入口全攻略 你是不是正为找工作发愁,听说 急需特种作业证才能上岗找工作 ,但又不清楚 高昌区电工证怎么考 ?别急,今天就给你讲透彻,从 官方报名入口 到考试内容、复习方法,一个不落。…

2026/11/11 22:07:53

泰安哪里办理电工证 上岗必备怎么找正规渠道

泰安哪里办理电工证 上岗必备怎么找正规渠道 证书过期了不知道怎么复审延期?最近很多在泰安工作的电工朋友都遇到了这个问题,尤其是像南阳卧龙区那些在建工项目上干活的建筑工人,一旦证过期就可能被停工,甚至面临罚款,影响收入和工作机会。别慌,这篇内…

2026/11/11 22:02:49

纳雍县电工证怎么转异地?郑州报考避坑指南全解析

纳雍县电工证怎么转异地?郑州报考避坑指南全解析 之前考的证在外省能不能转过来?这是很多在外地工作的纳雍县电工证持有者最关心的问题。特别是从贵州纳雍县走出去的电工从业者,很多在郑州等地工作多年,手里握着的是本地的证书,但随着工作地点的变化,证…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑