Day 27 贪心算法 Part01

455. 分发饼干

思路:既然要满足最多的小孩吃到饼干,那么肯定优先满足胃口小的更能满足最多的。因此,先对两个数组排序。每次选择最小的能满足当前孩子的饼干。

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int i_g = 0, i_s = 0;
        int cnt = 0;
        while(i_g < g.length && i_s < s.length){
            if( g[i_g] <= s[i_s]) {
                cnt++;
                i_g++; i_s++;
            }else{
                i_s++;
            }
        }
        return cnt;
    }
}

376. 摆动序列

这个思路是抄一个题解的,简单说一下吧。这里最终返回的结果可以看作是变化的次数。若上一次遍历是上升,这次遍历是下降,则结果加一;若上一次下降,这次上升,结果加一;其他的几种情况,例如上次上升,这次继续上升,上次下降这次继续下降,以及没有发生变化,则不统计。

这个思路与官解中贪心的解法是一致的,不过更好理解。

class Solution {
    public int wiggleMaxLength(int[] nums) {
        int cnt = 1;
        int sign = -1; //sign == 0 代表前一个小于后一个(也就是上升)  == 1代表大于后一个(下降)
        for(int i = 0; i < nums.length - 1; i++){
            if(nums[i] - nums[i+1] == 0) continue; //== 0 代表既不是上升也不是下降,因此可以删除
            else if(nums[i] - nums[i+1] > 0){
                if(sign != 1){ cnt++; sign = 1;}  //若前一次遍历时不是下降,说明找到了峰(找到了上升趋势)
            }else{
                if(sign != 0) { cnt++; sign = 0; } //同理
            }
        }
        return cnt;
        
    }
}

53. 最大子数组和

class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0];
        int sum = 0;
        for(int i = 0; i < nums.length; i++){
            if(sum < 0) sum = 0;
            sum += nums[i];
            max = Math.max(max, sum);
        }
        return max;
    }
}
posted @ 2024-07-29 19:57  12点不睡觉还想干啥?  阅读(16)  评论(0)    收藏  举报