代码随想录算法训练营第三十一天|理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

理论基础

贪心算法的本质是由局部最优推到全局最优,没有特定的套路

455.分发饼干

455. 分发饼干 - 力扣(LeetCode)
本题考虑将大饼干喂给胃口大的孩子,遍历孩子胃口的数组,用大饼干依次喂,直到满足条件,再移动饼干的位置

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int count = 0;
        int start = s.length - 1;
        //要遍历小孩胃口,不合适就下一个,因为要从大到小把饼干分完
        for (int i = g.length - 1; i >= 0; i--) {
            //这里用if就可以,不需要用while
            if (start >= 0 && s[start] >= g[i]) {
                start--;
                count++;
            }
        }
        return count;
    }
}

376. 摆动序列

376. 摆动序列 - 力扣(LeetCode)
本题局部最优是“删除”单调序列上中间的值,由此可以推出全局最优最长摆动子序列的长度。要注意有平坡的情况,要么都在curDiff加上=,要么在preDiff加上=

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];
            if (curDiff > 0 && preDiff <= 0 || curDiff < 0 && preDiff >= 0) {
                count++;
                preDiff = curDiff;
            }
        }
        return count;
    }
}

53. 最大子序和

53. 最大子数组和 - 力扣(LeetCode)
本题主要是如何找到子数组的起始位置,当前面数组和为负数并且下一个数为正数时,那么就将起始位置设置为这个正数,然后再持续计算比较子数组总和

class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = Integer.MIN_VALUE;
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            maxSum = Math.max(sum, maxSum);
            //sum小于0时,就重新设置起始位置
            if (sum < 0) {
                sum = 0;
            }
        }
        return maxSum;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容