Kimi LeetCode 3640. 三段式数组 II Java实现

📅 2026/7/20 12:11:24
Kimi    LeetCode 3640. 三段式数组 II Java实现
解题思路三段式子数组是一个连续子数组 nums[l...r]满足 严格递增 → 严格递减 → 严格递增 的形状。核心思路是分组循环一次线性扫描找到所有可能的“峰”和“谷”结构并贪心地向左右延伸来最大化总和。· 确定骨架先找一段严格递增确定 peak峰再找一段严格递减确定 bottom谷。· 贪心延伸· 向右从 bottom 向右在严格递增段中找和最大的前缀。· 向左从 peak 向左在严格递增段中找和最大的后缀。· 更新与重置计算总和并更新答案。然后将指针移到 bottom因为这里可能是下一个三段式结构的起点。Java 实现javaclass Solution {public long maxSumTrionic(int[] nums) {int n nums.length;long ans Long.MIN_VALUE;int i 0;while (i n) {int start i;// 1. 找第一段严格递增确定峰 (peak)i;while (i n nums[i - 1] nums[i]) {i;}// 如果递增段长度 2无法形成峰跳过if (i start 1) {continue;}int peak i - 1;// 2. 找第二段严格递减确定谷 (bottom)// 先加上峰和峰左边一个元素作为骨架起点long sum nums[peak - 1] nums[peak];while (i n nums[i - 1] nums[i]) {sum nums[i];i;}// 如果递减段长度 2或到达数组末尾或遇到相等元素不合法if (i peak 1 || i n || nums[i - 1] nums[i]) {continue;}int bottom i - 1;// 3. 找第三段严格递增贪心向右延伸sum nums[i]; // 加上谷右边第一个元素第三段起点i;long maxRight 0, curRight 0;while (i n nums[i - 1] nums[i]) {curRight nums[i];maxRight Math.max(maxRight, curRight);i;}sum maxRight;// 4. 贪心向左延伸第一段long maxLeft 0, curLeft 0;for (int j peak - 2; j start; j--) {curLeft nums[j];maxLeft Math.max(maxLeft, curLeft);}sum maxLeft;// 5. 更新答案并将指针重置到谷 (bottom)ans Math.max(ans, sum);i bottom;}return ans;}}复杂度分析· 时间复杂度O(n)。每个元素被访问常数次指针 i 总体上只向右移动。· 空间复杂度O(1)。只使用了常数个额外变量。