当前位置:   article > 正文

算法训练营day26--455.分发饼干+376. 摆动序列+53. 最大子序和

算法训练营day26--455.分发饼干+376. 摆动序列+53. 最大子序和

一、455.分发饼干

题目链接:https://leetcode.cn/problems/assign-cookies/
文章讲解:https://www.programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html
视频讲解:https://www.bilibili.com/video/BV1MM411b7cq

1.1 初见思路

  1. 小饼干先喂饱小胃口

1.2 具体实现

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int num = 0;
        for(int i=0;i<s.length;i++){
            int curCookie = s[i];
            if(num==g.length){
                break;
            }
            if(curCookie>=g[num]){
                num++;
            }
        }
        return num;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

1.3 重难点

二、 376. 摆动序列

题目链接:https://leetcode.cn/problems/wiggle-subsequence/
文章讲解:https://www.programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html
视频讲解:https://www.bilibili.com/video/BV17M411b7NS

2.1 初见思路

  1. 需要考虑多种情况:上下坡中有平坡、数组首尾两端、单调坡度有平坡

2.2 具体实现

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        //当前差值
        int curDiff = 0;
        //上一个差值
        int preDiff = 0;
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            //得到当前差值
            curDiff = nums[i] - nums[i - 1];
            //如果当前差值和上一个差值为一正一负
            //等于0的情况表示初始时的preDiff
            if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
                count++;
                preDiff = curDiff;
            }
        }
        return count;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2.3 重难点

三、53. 最大子序和

题目链接:https://leetcode.cn/problems/maximum-subarray/
文章讲解:https://www.programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html
视频讲解:https://www.bilibili.com/video/BV1aY4y1Z7ya

3.1 初见思路

  1. 如果包含正数,肯定需要从正数开头
  2. 要考虑数组中只有负数的情况

3.2 具体实现

class Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 1){
            return nums[0];
        }
        int sum = Integer.MIN_VALUE;
        int count = 0;
        for (int i = 0; i < nums.length; i++){
            count += nums[i];
            sum = Math.max(sum, count); // 取区间累计的最大值(相当于不断确定最大子序终止位置)
            if (count <= 0){
                count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
            }
        }
       return sum;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3.3 重难点

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/821960
推荐阅读
相关标签
  

闽ICP备14008679号