代码随想录刷题营Day31(455:分发饼干,376:摆动序列,53:最大子序和)

分发饼干:455

这道题目是贪心算法的入门题目,当作经典题目来训练贪心思维吧!主要再看看代码怎么写。
首先,有几个小孩就有多少胃口值,然后就是饼干数组。
为了能够不浪费,我们肯定是希望大饼干去喂胃口值最大的那个小孩。
因为最后统计的是数量,那么可以给两个数组排个序!

        g.sort()
        s.sort()

排完序之后就可以遍历胃口或者是饼干数组,那么是先遍历饼干呢还是先遍历胃口值呢。觉得先遍历胃口值比较好理解,每次遍历一个胃口值,就去看有没有饼干能够满足他,没有的话,拉到了,有的话,就计数。然后饼干数组向前移动一位。

        res=0
        start=len(s)-1
        for i in range(len(g)-1,-1,-1):
            if start>=0 and g[i]<=s[start]:
                start=start-1
                res=res+1

这里的写法比较独特,,我们用for循环从后往前遍历,注意这样的写法,要学起来!(不过如果改变sort的从小到大的顺序的话,就不用这样写)这里for是遍历的胃口值,从大往小遍历。为了避免双for循环,那就将遍历饼干数组就用start来代替。如果能够为该当前的胃口值,找到最适合的饼干,那就start-1,res+1.也就是给胃口找饼干的过程。


摆动序列:376

这个题就当二次赏析了,二刷了,还不知道该怎么写,为啥呢,一是脑子里面只记得波峰波谷了,当时忘记怎么统计,二是脑子总是被“怎么删除”所困扰。其实看了代码就明白,其实不用删除,如果遇到要删除的,直接不理他,不计数不就好了嘛。
还有就是要考虑特殊情况,比如[2,5]这样的,我们默认右边是有一个峰值,当此时的curDiff>0 and preDiff<=0时,就result+1。这样摆动序列就是2.
借随想录的图用用,我自己就不画了:
在这里插入图片描述
其实就是要对单调坡上的值进行“删除”,“删除”就是不理他!
具体看代码:

    def wiggleMaxLength(self,nums):
        if len(nums)<=1:
            return len(nums)
        curDiff=0
        preDiff=0
        result=1
        for i in range(len(nums)-1):
            curDiff=nums[i+1]-nums[i]
            if (curDiff>0 and preDiff<=0) or (curDiff<0 and preDiff>=0):
                result=result+1
                preDiff=curDiff
        return result

定义当前的差值和后续的差值,然后判断符合条件的就可以result+1
然后再把当前的差值赋值给先前的差值。
有点跟链表一样哈哈哈!


最大子序和:53

这个题呢,贪心算法,想通了就比较好写代码了。思路就是呢,如果加上一个值nums[i],让整个和成负数了,那这就是超级大的“拖油瓶”了。又因为题目要求取得连续的值,所以呢,就当前的和就应该从下面的nums数组值开始计算。也就是当前和要清零!

class Solution:
    def maxSubArray(self,nums):
        max_=float("-inf")
        tmp=0
        for i in range(len(nums)):
            tmp=tmp+nums[i]#先加上,看看是啥结果,下面有条件的判断。
            if tmp>max_:#当当前和大于最大值时,也就是加上的nums[i]是有益的
                max_=tmp#将当前和赋值给最大值
            if tmp<=0:#如果加上nums[i]直接拖垮了这个当前和,又因为要求返回的是连续的和
                tmp=0#那么当前和就要清零了。
        return max_

要有定一个当前和,一个max来存储最大值!这个思路就很清晰呀!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值