代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和
455. 分发饼干
题目链接:455. 分发饼干
- 小饼干也有大思路
- 先喂饱小胃口的
- 或者先用大饼给大胃口的
376. 摆动序列
题目链接:376. 摆动序列
- 局部最优:删除单调坡度上的多余节点,只剩下单调坡度两端的节点。
- 整体最优:整个序列有最多的局部峰值
- 贪心法curDiff等于0结果不自增,即进入分支
- 动态规划法,两个数组进行状态转移
-
class Solution { public: int wiggleMaxLength(vector<int>& nums) { int n = nums.size(); if (n < 2) { return n; } vector<int> up(n), down(n); up[0] = down[0] = 1; for (int i = 1; i < n; i++) { if (nums[i] > nums[i - 1]) { up[i] = max(up[i - 1], down[i - 1] + 1); down[i] = down[i - 1]; } else if (nums[i] < nums[i - 1]) { up[i] = up[i - 1]; down[i] = max(up[i - 1] + 1, down[i - 1]); } else { up[i] = up[i - 1]; down[i] = down[i - 1]; } } return max(up[n - 1], down[n - 1]); } };
53. 最大子数组和
题目链接:53. 最大子数组和
-
局部最优:当前连续和为负数的时候立刻放弃,从下一个元素重新计算连续和
-
整体最优:连续和最大
还有个比较最大值的过程ans = Math.max(ans, sum);