贪心算法的核心在于每一步都做出当前看起来最优的选择,从而期望最终达到全局最优。这类策略往往需要结合具体问题的特性来设计状态转移方程。下面我们通过几个经典的 LeetCode 题目来深入理解贪心思想在数组处理中的应用。
1. LeetCode376. 摆动序列
这道题的题意比较直观,就是求一个最长的摆动子序列,可以通过删除原数组中不符合条件的元素来实现。

解决思路的关键在于识别极值点。为了获得最长序列,我们在选择数字时,应尽可能让当前选择的数成为局部最大值或最小值。这样能为后续的选择留出更大的空间。例如图中 c 和 d 之间有一个点 x1,如果选 x1,后续可能无法选择比它小的数;而选到真正的波峰或波谷(如 b 点),则能最大化后续的可能性。
实现上,我们可以通过计算相邻元素的差值来判断趋势变化。如果前一段差值为正,后一段为负,或者反之,说明遇到了极值点。代码中利用 left 记录上一段差值,right 记录当前差值,当两者符号相反时计数增加。
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 = 0; i < sz - ; ++i) {
right = nums[i + ] - nums[i];
(!right) ;
((left * right) < ) {
ret++;
}
left = right;
}
ret + ;
}
};





