随想录训练营Day31 | 贪心 455.分发饼干, 376. 摆动序列, 53. 最大子序和

66 阅读1分钟

随想录训练营Day31 | 贪心 455.分发饼干, 376. 摆动序列, 53. 最大子序和

标签: LeetCode闯关记


455.分发饼干

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int count = 0;
        for (int i = 0, start = 0; i < s.length && start < g.length; i++) {
            if(s[i] >= g[start]){
                start++;
                count++;
            }
        }
        return count;
    }
}

time: 7 min

376. 摆动序列

思路: 找峰值 三种特殊情况

  1. diff 出现0,即平坡, 两种: ①单调坡上的平坡; ②上下坡中有平坡
  2. 只有两个不同的元素,那摆动序列也是2 代码中对于特殊情况的处理

//似懂非懂
class Solution {
    public int wiggleMaxLength(int[] nums) {
        int prediff = 0;//默认首个元素前面还有一个相同数值的元素
        int curdiff = 0;//默认为0是因为反正之后都会变
        int count = 1;//默认第一个元素为峰值并计入count
        if(nums.length == 1){
            return count;
        }
        for (int i = 0; i < nums.length - 1; i++) {//边界值也有讲究,还是不太懂
            curdiff = nums[i + 1] - nums[i];
            if(prediff <= 0 && curdiff > 0 || prediff >=0 && curdiff < 0){//在prediff上取等是因为考虑到1)平坡的情况②, 取最右边的元素
                count++;
                prediff = curdiff;
            }
        }
        return count;
    }
}

time: 1h

53. 最大子序和

思路: 局部最优--当前面的元素和sum < 0, 再加上sum就是拖累, 所以需要丢弃掉,使sum=0,再从后面的元素找最大子序列; 细节:

  • result(用来记录连续子数组的最大和)依赖于sum的变化,即if(sum > result),result会更新数值;
  • result具有一定独立性(这也是result的作用) : 考虑这种情况: sum 不断变小,但仍 > 0,此时子序列的和在变小,但是sum没有被丢弃掉,此时result的作用发挥出来了,即仍然在result处保存了之前的最大值;(这种情况就是,sum虽然成为拖累,但是还没丢弃)
class Solution {
    public int maxSubArray(int[] nums) {
        int result = Integer.MIN_VALUE;//(result用来记录连续子数组的最大和)
        int sum = 0; //sum用于记录nums[i]之前的数组元素和, 一旦sum< 0,则抛弃掉,因为再加上只会拖累后面的元素
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if(sum > result){
                result = sum;
            }

            if(sum < 0){
                sum = 0;
            }
        }
        return result;
    }
}

time: 45min