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

发布时间:2026/9/22 18:07:16

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/9/22 4:49:47

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

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

2026/9/19 14:34:54

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

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

2026/9/22 18:06:19

3步吃透管理自己,面试必问底层逻辑全解析

3步吃透管理自己,面试必问底层逻辑全解析 面试被问“如何管理自己”时,80%的开发者支支吾吾,答非所问。 这不仅是软技能题,更是考察你对 状态机转换 与 资源调度 理解的试金石。…

2026/9/22 18:06:19

5kfz现场避坑指南:3个高频考点与完整示例解析

5kfz现场避坑指南:3个高频考点与完整示例解析 刚拿到5kfz证书的朋友,是不是都在配置环境时卡了半天?别急,这不仅是你的问题,更是行业里90%从业者的通病。很多新手拿着证书去现场,结果因为环境配置不对、流程不熟,直接导致项目延期。今天这…

2026/9/22 18:06:19

CF人物模型底层逻辑拆解:版本升级API变更保姆级教程

CF人物模型底层逻辑拆解:版本升级API变更保姆级教程 版本升级后 API 全变了?别慌,CF人物系统的底层映射没变。 很多老哥在接手项目时,一跑代码就报错,参数对不上,对象引用丢失。 这篇保姆级教程,带你从内存堆栈角度,彻底搞懂 CF…

2026/9/22 18:06:19

天子驾三高频面试题:3分钟吃透底层原理

天子驾三高频面试题:3分钟吃透底层原理 面试被问原理答不上来,那种尴尬真的无解。很多开发者背熟了“天子驾三”这个高频面试题的答案,但面试官稍微追问一句底层实现,立马卡壳。今天咱们不背八股文,直接拆代码、看流程,把这块硬骨头啃下来。…

2026/9/22 18:06:19

手机修改qq密码手写实现原理深度解析

手机修改qq密码手写实现原理深度解析 面对一长串红色的 StackTrace 报错信息,很多开发者第一反应是头皮发麻。那些堆栈追踪里混杂着 IOException 、 ConnectException 或者…

2026/9/22 18:01:19

5个考点拆解考生自述:面试必问的底层逻辑与避坑指南

5个考点拆解考生自述:面试必问的底层逻辑与避坑指南 刚考完试,手里捏着一张成绩单,心里却七上八下?别慌,这是90%考生的通病。你背了无数遍“考生自述”的模板,代码写得飞起,但一到实战场景,脑子就一片空白。面试官最爱问的【面试必问】问题,往往…

2026/9/22 10:02:42

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/22 9:07:39

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/22 0:04:49

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点 官方文档几百页翻到头还是懵?面试问到 输电线路在线监测 的数据链路时,脑子一片空白?别慌,这种 高频面试题 我整理了10年,专门治各种“文档太长抓不住重点”的毛病。…

2026/9/22 0:04:49

中介房源管理系统重构避坑:3个关键步骤搞定API变更

中介房源管理系统重构避坑:3个关键步骤搞定API变更 版本升级后 API 全变了,这种痛只有真做过的人懂。 很多团队在接手老旧房产项目时,最崩溃的不是代码烂,而是底层框架升级后,原本熟悉的接口调用方式彻底失效。 这份 保姆级教程…

2026/9/22 0:04:49

3个坑点带你一文搞懂55gg小游戏源码

3个坑点带你一文搞懂55gg小游戏源码 盯着控制台满屏的红色报错,看着那一长串 StackTrace ,是不是脑子瞬间宕机?别急,这种时候最忌讳的就是盲目改代码。很多刚入行的前端同学,面对 55gg 小游戏这类轻量级 H5…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/21 18:32:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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