代码随想录算法训练营day31|分发饼干、摆动序列、最大连续子数组

2023.4.14 分发饼干

455. 分发饼干 - 力扣(LeetCode)

要尽可能满足数量多的孩子,因此我们的饼干尺寸最好与胃口贴合,所以我们可以先将两个数组排序后,从后往前遍历,这样我们就能从最大胃口的孩子和最大尺寸的饼干开始比较。(试想一下,如果不排序的话,可能会有如下情况发生,加入有两个胃口分别为1,2的孩子,而我们的饼干尺寸也为1,2,如果我们使用大的饼干尺寸2去满足小的胃口1,那么剩下一个孩子就不能得到满足。因此,我们必须使用排序后来进行比较才能满足数量最多的孩子。),如果不符合,就继续向前比较。即利用排序加双指针的思想。

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        //两个指针从后往前遍历
        int i = g.length-1;
        int j = s.length-1;
        int count = 0;
        while(i >= 0 && j >= 0){
            if(g[i]<=s[j]){//满足分配规则
            count++;
            i--;
            j--;
            }
            else{//饼干尺寸不够,看看前一个孩子的胃口。
            i--;
            }
        }
        return count;
    }
}

2023.4.14 摆动序列

376. 摆动序列 - 力扣(LeetCode)

根绝题目要求,摆动序列是要求连续两个相邻数之间的差一个为正一个为负的,因此我们需要一个变量去记录前两个数的差,另一个变量去记录当前两个数的差。如果将数的大小展示在一个图上,那么摆动序列的示意就是相邻的一个上坡一个下坡,注意,如果出现了连续的上坡或者下坡只能记录一次,此外,平路也是不能被记录的。

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length == 1){
            return 1;
        }
        if(nums.length == 2 && nums[0] != nums[1]){
            return 2;
        }
        int count = 1;
        int pre = 0;
        int cur = 0;
        for(int i = 0;i<nums.length-1;i++){
             cur = nums[i+1] - nums[i];
            //注意:实际上,pre在后续的判断中是不能为0的,因为为0代表了平路,而我们的摆动是不会记录平路的,之所以为0是因为我们的第一次初始值默认为0,在后续的判断中pre不会再为0.
            if((pre >= 0 && cur<0) ||(pre <=0 && cur >0)){//满足条件,更新pre和count;
                count++;
                //当不满足条件,比如cur=0,代表为平路,是不会进入当前条件判断的,因此pre在后续的判断中永远不会为0
                pre = cur;
            }
        }
        return count;
    }
}

2023.4.14 最大连续子数组

53. 最大子数组和 - 力扣(LeetCode)

本题使用贪心的思路:我们从数组头开始记录连续子数组和,如果当前和为负数,那么就舍去这个和,因为负数会减小我们的最终结果,我们从后一位重新计算,只要当当前连续数组和大于0了,我们就往后加,并不断更新最大值。直到到达了数组末尾。

class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = Integer.MIN_VALUE;
        int curSum = 0;
        for(int i  = 0;i<nums.length;i++){
            curSum +=nums[i];
            maxSum = Math.max(maxSum,curSum);
            if(curSum < 0){
                curSum = 0;
            }
        }
        return maxSum;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值