代码随想录算法训练营第三十一天| LeetCode455.分发饼干、LeetCode376.摆动序列、LeetCode53.最大子序和

LeetCode 455 分发饼干

题目链接:455. 分发饼干

【解题思路】

每次都选最大的饼干,尽量喂饱胃口大的小孩

【解题步骤】

  • 1.首先将胃口数组与饼干数组进行排序

  • 2.新建一个变量记录喂饱了多少个小孩

  • 3.定义一个index表示当前饼干的位置

  • 4.遍历小孩数组(从大往小遍历):

    • 用while(成功投喂之后)遍历饼干数组

      • 当我们成功投喂一个小孩,result ++,index --

  • 5.return result

【代码部分】

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(start >= 0 && g[i] <= s[start]){//如果还有饼干,并且当前饼干能喂饱当前小孩
                start --;//饼干-1
                count ++;//饱了的小孩+1

            }
        }
        return count;
    }
}

LeetCode 376 摆动序列

题目链接:376. 摆动序列

【解题思路】

  • 不用真的去做删除操作,我们只需要遇到摆动的时候用count计数器++,统计摆动出现的次数最后返回即可

  • 如果找到一个峰值,将峰值的前一个坡度定位prediff,峰值的后一个坡度定为crudiff,如果prediff和crudiff的正负不同,则为一个摆动

  • 1.如果相邻元素有相同,即出现平坡的情况,则摆动序列的长度应该为3;可以往左删元素也可以往右删元素,当出现这种情况的时候,prediff == 0,curdiff <0;或者prediff>0,curdiff == 0

  • 2.需要对首尾元素进行特殊性判断,当判断首元素的时候,可以将其前面再多加一个相同元素,这样就可以判断是否为摆动了;当判断尾元素时,可以默认尾元素就是一个摆动,这样的话,我们再遍历时就不遍历最后一个元素了

  • 3.如果单调坡中有平坡,就会出现错误统计prediff=0,crudiff>0的情况,所以我们当坡度的方向有变化(遇到了一个摆动)的时候prediff才跟着curdiff动,其他情况下如果出现坡度,prediff只记录坡度的方向

【解题步骤】

  • 1.如果nums.size = 1,return 1;

  • 2.prediff = 0;curdiff = 0;result = 1;

  • 3.遍历数组,注意!不用遍历最后一个元素,因为我们默认最后一个元素就为一个摆动了。

    • 记录波动:curdiff = nums[i+1] - nums[i]

    • 如果prediff >=0 && curdiff < 0或者prediff <=0 && curdiff > 0:

      • result+1

      • 往下遍历,将prediff指向当前curdiff的位置,这样prediff就一直跟着curdiff,一直往下判断

【代码部分】

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;
    }
}

LeetCode 53 最大子序和

题目链接:53. 最大子数组和

【解题思路】

  • 当连续和为负数的时候立刻抛弃当前连续和,从下一个数开始遍历

  • 注意!是连续和为负数的时候才进行抛弃,而不是遇到负数就抛弃

  • 每一次累加后用一个result及时记录出现的最大值

  • 遇到累加后大于result的情况才更新result的值

【解题步骤】

  • 1.定义一个result记录最大值,初始化为最小值

  • 2.定义一个count,记录连续和

  • 3.遍历数组:

    • count累加当前位置的元素

      • 如果当前的count大于result

        • 将count的值赋给result

      • 如果当前count小于0

        • 将count重置为0

  • 4.return result

【代码部分】

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

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值