发布时间:2026/8/6 7:34: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/8/6 7:34:53

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

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

2026/8/6 7:34:53

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

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

2026/8/6 8:29:56

Unity UGUI DrawCall分析工具:原理、实现与性能优化实战

1. 项目概述:为什么我们需要一个UGUI DrawCall分析工具?如果你是一名Unity开发者,尤其是负责过中重度手游或应用UI模块的程序,那么“UI卡顿”这四个字大概率是你的噩梦。项目初期UI流畅丝滑,随着功能迭代,界…

2026/8/6 8:29:56

Unity AssetBundle资源管理:从打包策略到热更新实战指南

1. 项目概述:为什么AssetBundle是Unity开发绕不开的坎如果你在Unity开发中遇到过安装包体积爆炸、热更新无从下手,或者游戏加载时卡顿半天、内存占用居高不下,那你大概率已经和AssetBundle打过照面了。这玩意儿可以说是Unity资源管理的“硬通…

2026/8/6 8:29:56

Unity高性能GIF解码方案:UniGif核心原理与移动端优化实战

1. 项目概述:为什么Unity开发者需要关注GIF解码性能?在Unity项目里处理动态图像,尤其是GIF,一直是个让人又爱又恨的活儿。爱的是,GIF格式兼容性极广,从表情包到产品演示,几乎无处不在&#xff0…

2026/8/6 8:29:56

AMAT 0090-B2971 电源接口模块

AMAT 0090-B2971 电源接口模块简介AMAT 0090-B2971是一款由应用材料公司推出的电源接口模块,负责将主电源安全分配至各子系统,确保半导体设备稳定运行。产品特点(8条)应用材料公司原厂制造,专为半导体设备设计具备多路…

2026/8/6 8:29:56

UE5动态血条实现:从蓝图到C++的呼吸感UI系统设计

1. 项目概述:为什么我们需要一个“会呼吸”的血条?在UE5里做UI,尤其是游戏里最常见的血条,很多教程会告诉你拖个进度条控件、绑定个变量就完事了。但如果你想让你的游戏在视觉反馈上脱颖而出,让玩家能直观感受到角色状…

2026/8/6 8:24:56

Python自动化邮件发送:从SMTP协议到实战封装

1. 项目概述:为什么我们需要自动化邮件发送? 在今天的数字化工作流中,邮件依然是不可替代的正式沟通渠道。无论是日常的运营报告、项目进度同步、系统监控告警,还是营销活动的批量触达,手动一封封地写邮件、添加附件、…

2026/8/5 3:13:11

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/6 0:04:22

电力系统调度中的源荷不确定性建模与优化实践

1. 电力系统调度中的源荷不确定性挑战现代电力系统正面临前所未有的复杂性,其中源荷不确定性(Source-Load Uncertainty)已成为调度决策中最棘手的难题之一。我在参与某省级电网调度系统升级时,曾遇到风电预测误差导致日内调度计划…

2026/8/6 0:04:22

VGG-T3技术解析:3D重建速度的革命性突破

1. 项目概述:VGG-T3如何重新定义3D重建速度在计算机视觉领域,3D场景重建一直是个计算密集型任务。传统方法重建1000帧图像规模的场景往往需要数小时甚至更长时间,而英伟达最新发布的VGG-T3技术将这个时间压缩到了惊人的54秒。这个突破性进展来…

2026/8/6 0:04:22

深度解析旅游网站建设的意义及其对行业发展的深远影响与核心价值体现

在这个数字化浪潮席卷全球的今天,我们似乎已经忘记了,曾经有一段时间,人们想要去一个陌生的地方,只能靠在书桌前翻阅厚厚的旅游杂志,或者向刚从那里回来的朋友询问那些模糊不清的印象。那时候,“远方”是一个需要精打细算才能抵达的奢侈概念。而现在,只需要一部手机,轻…

2026/8/5 19:21:13

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/5 19:21:13

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/5 19:21:13

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…