代码随想录算法训练营第27天|455.分发饼干、376. 摆动序列、53. 最大子序和

1.455.分发饼干

题目链接:455.分发饼干
文档讲解: 代码随想录

局部最优就是拿大饼干喂胃口大的小孩,全局最优就是喂饱尽可能多的小孩。先将饼干数组和小孩数组进行排序,然后从后向前遍历,用大饼干优先满足胃口大的,并统计满足的小孩数量。

class Solution(object):
    def findContentChildren(self, g, s):
        """
        :type g: List[int]
        :type s: List[int]
        :rtype: int
        """

        count = 0
        j = len(s) - 1
        #排序
        g.sort()
        s.sort()
        #遍历胃口
        for i in range(len(g) - 1, -1, -1):
            if j >= 0 and s[j] >= g[i]: # 要防止j溢出
                count += 1
                j -= 1
        return count

也可以换个思路,先拿小饼干满足胃口小的孩子。

class Solution(object):
    def findContentChildren(self, g, s):
        """
        :type g: List[int]
        :type s: List[int]
        :rtype: int
        """
        j = 0
        g.sort()
        s.sort()
        #要遍历饼干,只有喂饱胃口小的孩子,才能进行喂饱下一个孩子
        for i in range(len(s)):
            if j < len(g) and s[i] >= g[j]:
                j += 1
        return j

2.376. 摆动序列

题目链接:376. 摆动序列
文档讲解: 代码随想录

局部最优:删除单调坡度上的节点,那么这个坡度就会有两个局部峰值。定义两个变量来记录前后差值,prediff = nums[i] - nums[i-1],curdiff = nums[i+1] - nums[i],要么 prediff 小于0、curdiff 大于0,或者 prediff 大于0、curdiff 小于0。同时考虑到会有平坡的情况,只记录靠右的那个峰值,因此,判断条件变为要么 prediff 小于等于0、curdiff 大于0,或者 prediff 大于等于0、curdiff 小于0。本题统计峰值的时候,在数组最左边增加一段,例如,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0。默认结果从1开始,因为默认最右边有峰值。

还有第三种情况,那就是单调坡度中有平坡,例如[1,2,2,3,4],这样判断的时候会将第二个2计算进去,因为也满足prediff 小于等于0、curdiff 大于0。解决这个问题的办法,就是不让prediff实时跟着curdiff变化,在有坡度变化的时候再更新prediff。

class Solution(object):
    def wiggleMaxLength(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) <= 1:
            return len(nums)
        res = 1
        prediff = 0
        curdiff = 0
        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):
                res += 1
                prediff = curdiff
        return res                 

或者将判断条件改为:

if prediff * curdiff <= 0 and curdiff != 0:

3.53. 最大子序和

题目链接:53. 最大子序和
文档讲解: 代码随想录

看讲解视频的时候,我发现进入误区了,一开始认为只要遇到负数就跳过,从下一个数开始计算连续和。正确的应该判断连续和是否为负,完整思路则是,初始化count = 0, 遍历过程,count先加上当前元素值,若大于res则替换,接着判断是否不为正数,若非正,则再次初始化count。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = float('-inf')
        count = 0

        for i in range(len(nums)):
            count += nums[i]
            if count > res:
                res = count
            if count <= 0 :
                count = 0
        return res
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值