算法训练营第三十四天 | LeetCode 455 分发饼干、LeetCode 376 摆动序列、LeetCode 53 最大子数组和

算法训练营第三十四天 | LeetCode 455 分发饼干、LeetCode 376 摆动序列、LeetCode 53 最大子数组和

码农世界 2024-05-28 前端 88 次浏览 0个评论

LeetCode 455 分发饼干

这题排序后双指针即可。若s[j]>=g[i],两者都往后移,否则只有j能往后移。

贪心思想体现在对于每块饼干最大限度地被胃口最接近的孩子分到,达到利用率最高。

代码如下:

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        for (int i = 0; i < g.length-1; i++) {
            for (int j = 0; j < g.length - 1 - i; j++) {
                if (g[j] > g[j+1]) {
                    int temp = g[j+1];
                    g[j+1] = g[j];
                    g[j] = temp;
                }
            }
        }
        for (int i = 0; i < s.length-1; i++) {
            for (int j = 0; j < s.length - 1 - i; j++) {
                if (s[j] > s[j+1]) {
                    int temp = s[j+1];
                    s[j+1] = s[j];
                    s[j] = temp;
                }
            }
        }
        int num = 0;
        int i = 0, j = 0;
        while (i < g.length && j < s.length) {
            if (g[i] <= s[j]) {
                i++; j++;
                num++;
            } else {
                j++;
            }
        }
        return num;
    }
}

java里的排序函数还不太熟悉,先还是用冒泡吧。

LeetCode 376 摆动序列

这题看的题解,随着下标增长,主要记录波峰波谷数目,其中波峰波谷其实是加在一起的,不够最后看大小判断最大的那个序列最后一段是波峰还是波谷。

代码如下:

class Solution {
    public int wiggleMaxLength(int[] nums) {
        int n = nums.length;
        if (n < 2) {
            return n;
        }
        int up = 1, down = 1;
        for (int i = 1; i < n; i++) {
            if (nums[i] > nums[i - 1]) {
                up = down + 1;
            } else if (nums[i] < nums[i - 1]) {
                down = up + 1;
            }
        }
        return Math.max(up, down);
    }
}

这种解法相对于消减法在0,0,0这个测试用例上要更容易处理一点。

LeetCode 53 最大子数组和

这题其实满简单,就是要每一步先用记录和的变量sum记录这一路过来加上的数值,但是如果它已经比当前值小了,就直接将它的值变成当前值。贪心也就是贪在这里。用局部状态简化全局推导,同时用一个max变量,每一次循环和它进行比较,及时记录下最大值。

这里采用一种技巧:将sum和max赋值成nums[0],之后循环下标从1开始,这样可以避免一些问题,比如元素值可能是负数。

代码如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int sum = nums[0];
        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            sum += nums[i];
            if (nums[i] > sum) sum = nums[i];
            if (max < sum) max = sum;
        }
        return max;
    }
}

转载请注明来自码农世界,本文标题:《算法训练营第三十四天 | LeetCode 455 分发饼干、LeetCode 376 摆动序列、LeetCode 53 最大子数组和》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,88人围观)参与讨论

还没有评论,来说两句吧...

Top