贪心算法核心思路
贪心算法的关键在于局部最优推导全局最优。很多时候,我们不需要回溯或动态规划,只要每一步都做出当前看起来最好的选择,最终就能得到满意的结果。今天通过几道经典题目来深入理解这一策略。
LeetCode 376. 摆动序列
题目要求找出最长的摆动子序列。所谓摆动序列,就是相邻元素的差值正负交替。比如 1, 7, 4, 9, 2,差值为 +6, -3, +5, -7,符合摆动特征。

解题思路
为了获得最长序列,我们在遇到极值点(波峰或波谷)时应该保留它。如果中间夹了一个非极值点,比如 a < x < b,选 x 会限制后续的选择空间;而直接选 b 作为下一个转折点,能留出更多余地给后面的元素。
代码实现上,我们可以比较相邻元素的差值。用 left 记录上一段的差值,right 记录当前段的差值。当两者符号相反(乘积小于 0)时,说明找到了一个转折点,计数加一。注意处理连续相同数字的情况,此时差值为 0,应跳过。
最后返回结果时需要加 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;
( i = ; i < sz - ; ++i) {
right = nums[i + ] - nums[i];
(!right) ;
((left * right) < ) {
ret++;
}
left = right;
}
ret + ;
}
};


