代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和

284 阅读1分钟

代码随想录算法训练营第三十一天 | 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);