贪心算法实战:摆动序列与最长递增子序列详解
在解决序列相关问题时,贪心策略往往能带来比动态规划更优的空间复杂度。本文将通过四道经典力扣题目,梳理贪心算法在处理'摆动'、'递增'及'连续'序列时的核心思路。
1. 摆动序列(Wiggle Subsequence)
题目要点 给定一个整数数组,返回其中最长摆动子序列的长度。摆动序列定义为相邻元素差值正负交替的序列。
思路解析 关键在于捕捉局部极值点。我们不需要真正构造出子序列,只需统计波峰和波峰之间的变化次数。遍历数组时,记录当前趋势的变化。如果当前差值与前一次差值符号相反,则计数加一。注意初始值设为 1,因为单个元素本身也算长度为 1 的序列。

代码实现
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums.length < 2) return nums.length;
int left = 0;
int ret = 1;
for (int i = 0; i < nums.length - 1; i++) {
int right = nums[i + 1] - nums[i];
if (right == 0) continue;
if (left * right <= 0) {
ret++;
left = right;
}
}
return ret;
}
}



