代码随想录|455.发饼干,376.摆动序列,53.最大子序和

 455.发饼干

class Solution:#大饼干优先
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()#将孩子的贪心因子排序
        s.sort()#将饼干的尺寸排序
        index=len(s)-1
        result=0
        for i in range(len(g)-1,-1,-1):#遍历胃口,从最后一个孩子开始
            if index>=0 and s[index]>=g[i]:
                result+=1
                index-=1
        return result

class Solution:#小饼干优先
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()#将孩子的贪心因子排序
        s.sort()#将饼干的尺寸排序
        index=0
        for i in range(len(s)):#遍历饼干
            if index<len(g) and g[index]<=s[i]:
                index+=1
        return index

376.摆动序列

我们思考本题的一个大题思路,但本题要考虑三种情况:

  1. 情况一:上下坡中有平坡
  2. 情况二:数组首尾两端(可以假设数组前面还有一个元素)
  3. 情况三:单调坡中有平坡( 单调中的平坡 不能算峰值(即摆动))

因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)

题目中说了,如果只有两个不同的元素,那摆动序列也是 2

只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。

本题异常情况的本质,就是要考虑平坡, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums)<=1:
            return len(nums)#如果数组长度为0或1,直接返回
        curdiff=0#当前元素的差值
        prediff=0#前一对元素的差值
        result=1#记录峰值的个数,初始为1(默认最右边的元素为峰值)
        for i in range(len(nums)-1):
            curdiff=nums[i+1]-nums[i]
            if (prediff<=0 and curdiff>0) or(prediff>=0 and curdiff<0):
                result+=1#峰值个数加一
                prediff=curdiff#只有摆动变化的时候更新prediff,预防单调坡度有平波
        return result

53.最大子序和

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        result=float("-inf")
        count=0
        for i in range(len(nums)):
            count+=nums[i]
            if count>result:
                result=count
            if count<=0:
                count=0#这种做法相当于重置最大子序的起始位置,因为遇到负数一定是拉低总和
        return result        
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值