代码随想录算法训练营 day 31: 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

59 阅读1分钟

455. Assign Cookies

这题的思路还是很好想的,从小饼干开始,给每块饼干找能满足需求的小孩。需要先对数组排序。 或者从大饼干开始,找需求最大的小孩,先满足了。 两个思路看似很像,都是给饼干找小孩,实际写起来,第一个是找需求最低的小孩,第二个是找需求最高的小孩。判断条件不同。

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        int count = 0;

        Arrays.sort(g);
        Arrays.sort(s);

        int gi = 0; 
        int si = 0;

        while(gi < g.length && si < s.length) {
            if(g[gi] <= s[si]) {
                count++;
                gi++;
                si++;
            }
            else if (g[gi] > s[si]) {
                si++;
            }
        }

        return count;
        
    }
}

376. Wiggle Subsequence

这题就没思路了。一开始集中在相邻元素间的比较,但比较相邻的差值更好写。

class Solution {
    public boolean isNegative(int num) {
        return num < 0;
    }
    public int wiggleMaxLength(int[] nums) {
        if(nums.length <= 1) {
            return nums.length;
        }

        int count = 1;
        int lastDiff = 0;
        int curDiff = 0;

        for(int i=1; i<nums.length; i++) {
            curDiff = nums[i] - nums[i-1];

            if(lastDiff >= 0 && curDiff < 0 || lastDiff <= 0 && curDiff > 0) {
                count++;
                lastDiff = curDiff;
            }

        }

        return count;
        
    }
}

53. Maximum Subarray 贪心的题目确实是思路难找。这题的思路是如果连续子数组的和小于0,就把临时结果清零。

class Solution {
    public int maxSubArray(int[] nums) {
        int result = Integer.MIN_VALUE;
        int count = 0;

        for(int i=0; i<nums.length; i++) {
            count += nums[i];

            if(count > result) {
                result = count;
            }

            if(count < 0) {
                count = 0;
            }
        }

        return result;
    }
}