【代码随想录训练营】【Day 34】【贪心-1】| Leetcode 455,376, 53

【代码随想录训练营】【Day 34】【贪心-1】| Leetcode 455,376, 53

需强化知识点

  • 感受贪心和动规的差异
    • 贪心:从局部最优到全局最优

题目

455. 分发饼干

  • 思路:小饼干尝试先满足小胃口
class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()

        result = 0
        i, j = 0, 0

        while i < len(s) and j < len(g):
            if s[i] >= g[j]:
                result += 1
                i += 1
                j += 1
            else:
                i += 1

        return result

376. 摆动序列

  • 注意 dp[i][0] = dp[i][1] = 1 每层的初始化,自身最起码都可以构成一个摆动序列
class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        dp = [[0] * 2 for _ in range(len(nums))]
        # i,0 为表示考虑前 i 个数,第 i 个数作为山谷的序列长度,i,1为山峰
        dp[0][0], dp[0][1] = 1, 1 

        for i in range(1, len(nums)):
            dp[i][0] = dp[i][1] = 1
            for j in range(0, i):
                if nums[i] > nums[j]:
                    dp[i][1] = max(dp[i][1], dp[j][0] + 1)
                if nums[i] < nums[j]:
                    dp[i][0] = max(dp[i][0], dp[j][1] + 1)
        return max(dp[len(nums)-1][0], dp[len(nums)-1][1])

53. 最大子数组和

  • 递归:以当前 i 结尾的最大连续子数组和
  • 贪心:当累计值为负数值,应立马抛弃,以接下来的值重新开始计数
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        # dp = [0] * len(nums)
        # dp[0] = nums[0]
        # result = nums[0]
        
        # for i in range(1, len(nums)):
        #     dp[i] = max(nums[i], dp[i-1] + nums[i])
        #     result = max(result, dp[i])
        # return result

        result = nums[0]
        count = 0
        
        for i in range(0, len(nums)):
            count += nums[i]
            result = max(result, count)
            if count < 0:
                count = 0
        return result
           
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值