Day31代码随想录贪心part01:455.分发饼干、376. 摆动序列(也可以动态规划)、53. 最大子序和(也可以动态规划)

本文介绍了三种与IT技术相关的编程问题解决方案:通过贪心策略分发饼干以最大化满足孩子,利用动态规划找出摆动序列中的最长部分,以及寻找具有最大和的连续子数组。关键在于理解和应用贪心算法和动态规划的思想。
摘要由CSDN通过智能技术生成

Day31 贪心part01

455.分发饼干

题意:对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

  • 输入: g = [1,2], s = [1,2,3]
  • 输出: 2
  • 解释:你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足。所以你应该输出 2.

核心思想:饼干大的分给胃口大且能满足他的小孩

当然其实用小饼干满足尽量小的小孩其实也是可以的

首先将胃口和饼干两个数组都从小到大排序,从大往小遍历

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        num = 0
        index = len(s)-1 #饼干的倒叙
        for i in range(len(g)-1,-1, -1):
            # 注意边界条件,从len(g)-1开始,走到0但因为是开区间所以是-1,每次-1步
            if index>=0 and g[i]<=s[index]:
                num +=1
                index -=1
        return num

**值得注意的事情:**这里是从小孩的胃口g开始倒叙遍历的,而不是从饼干的大小开始的,这是很重要的!!!因为如果从饼干大的开始,发现饼干满足不了胃口最大的小孩,所以饼干减减,一直满足不了,那么结果就是不对的;

所以 一定要 for 控制 胃口,里面的 if 控制饼干。

376. 摆动序列(也可以动态规划)

题意:例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

思路:

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值

整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列

遇到摆动就++(通过prediff=num[i]-num[i-1]和curdiff=num[i+1]-num[i]是否茼蒿判断),如果是坡上的元素就不加了

一些特殊情况的判断:

  • 上下坡有平坡比如[1,2,2,2,1]这种情况→[1,2,1]:prediff=0,curdiff<0或>0这种情况情况
  • 首尾元素:[1,2]变成→[1,1,2]就可以使用上面的规则了得到2,这样如果是[2,2]→[2,2,2]最后也是1
  • 平坡情况:可能是图上的上下坡度,但也可能是上-平-上的单调坡。prediff没必要实时跟着curdiff变化,只有有变化之后再跟随就可以
class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 1
        prediff = 0
        curdiff = 0
        res = 1
        # if len(nums)==2: # 复杂了,下面的是兼容的
        #     curdiff = nums[1]-nums[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

53. 最大子序和(也可以动态规划)

题意:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

  • 输入: [-2,1,-3,4,-1,2,1,-5,4]
  • 输出: 6
  • 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

思路:如果前面的结果和是负数,那与后面的数相加只会让后面变得更小,比如-2+1=-1反而让1变小了,那么还不如重新开始呢

是连续和是负数的时候抛弃,不是只要遇到负数就抛弃

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum = float('-inf')
        now_sum = 0
        for i in range(len(nums)):
            if now_sum<0:
                now_sum = nums[i]
            else:
                now_sum += nums[i]
            if now_sum>max_sum:
                max_sum = now_sum
        return max_sum

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值