贪心算法的核心在于每一步都做出当前状态下的最优选择,从而期望达到全局最优。这类问题往往需要一定的经验积累,通过刷题可以加深理解。以下结合四个经典题目进行实战分析。
1. LeetCode 376. 摆动序列
题意比较直观,求一个最长的摆动子序列,可以从原数组中删除不符合条件的数。

思路方面,核心是寻找极值点。在局部范围内,选到波峰或波谷能为后续留下更多选择空间。比如图中 c 和 d 之间有个点 x1,若选了它,后续可能就无法满足摆动条件。因此每次都要选最值。
代码实现上,可以用差值法观察符号变化。以 b 点为例,前一段差值为正,后一段为负,说明 b 是极值点;若非极值点,则差值符号一致。利用这个特性编写代码即可。

注意边界情况,比如数组长度小于等于 2 时,或者连续相同元素的情况。最后结果加 2 是因为计算过程中未包含首尾端点。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int left = 0;
int right = 0;
int sz = nums.size();
int ret = 0;
if (sz == 1 || (sz == 2 && (nums[0] == nums[1]))) return 1;
if ((nums[0] == nums[sz - 1]) && (nums[0] == nums[sz / 2])) return 1;
for (int i = ; i < sz - ; ++i) {
right = nums[i + ] - nums[i];
(!right) ;
((left * right) < ) {
ret++;
}
left = right;
}
ret + ;
}
};





