【代码随想录训练营】Day31-贪心算法

代码随想录训练营 Day31

今日任务

455.分发饼干
376.摆动序列
53.最大子序和
语言:Java

455. 分发饼干

链接:https://leetcode.cn/problems/assign-cookies/

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

376. 摆动序列

链接:https://leetcode.cn/problems/wiggle-subsequence/
难点:preDiff 和 0 比较时为何可以加上等号
要返回的结果count表示的是 坡度个数+1,所以我们只需要尽可能记录坡度(上坡 / 下坡),preDiff 为0,curDiff 不为0是会产生一个向上 / 下的坡度的;我们也可以认为 preDiff 为0的情况属于序列初始位置的坡度判断。

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length <= 1){
            return nums.length;
        }
        int count = 1;
        int curDiff = 0;
        int preDiff = 0;
        for(int i = 1; i < nums.length; i++){
            curDiff = nums[i] - nums[i - 1];
            if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)){
                count++;
                preDiff = curDiff;
            }
        }
        return count;
    }
}

53. 最大子序和

链接:https://leetcode.cn/problems/maximum-subarray/
这道题O(N^2)时间复杂度应该是不行的

class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length == 1){
            return nums[0];
        }
        int curSum = 0;
        int result = -10001;
        for(int i = 0; i < nums.length; i++){
            curSum += nums[i];
            result = result < curSum ? curSum : result;
            if(curSum < 0){
                curSum = 0;
            }
        }
        return result;
    }
}

你可能感兴趣的:(代码随想录训练营,leetcode,java)