代码随想录算法训练营day31|Leetcode455/376/53

Leetcode455分发饼干

力扣

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

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

今天来到了贪心算法的章节,从比较简单的分发饼干开始

讲讲思路:如果一万的现金在你面前,只能让你在固定的次数拿完,你怎么拿?

是不是每次都拿最多的就可以拿到整体最多的钱。

这就是 局部最优->整体最优

 这道题也是一样,用大饼干的尺寸去优先满足大胃口的孩子,有的同学问,为什么我不能用大饼干去喂小胃口的孩子呢?

你是想要撑死他嘛?!你喂它这么多他虽然吃的饱,但是如果你还有更优的选择,比较小的尺寸 刚好也能喂饱小胃口的孩子,那为什么不去呢!大饼干就拿去喂大胃口的呗。全部都饱了,而且还没浪费。

所以,一开始,对饼干数组和孩子数组进行排序,然后从后向前遍历。

如果饼干数组的i>=孩子数组的胃口,那么就代表喂饱了一个,初始换num=0,这个时候就+=1

然后index向前遍历,就是index-=1

最后循环完毕我们的孩子数组,返回num

代码:

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):
            if index>=0 and s[index]>=g[i]:
                num+=1 
                index-=1
        return num

Leetcode376 摆动序列

力扣

 

 

思路:用贪心来解决 如图所示

只需要保证 这一整个序列有一个最多的局部峰值。 

贪心的题目说简单有的时候就是常识,说难就难在都不知道该怎么用贪心

本题大家如果要去模拟删除元素达到最长摆动子序列的过程,那指定绕里面去了,一时半会拔不出来。

而这道题目有什么技巧说一下子能想到贪心么?

其实也没有,类似的题目做过了就会想到。

此时大家就应该了解了:保持区间波动,只需要把单调区间上的元素移除就可以了。

代码:

def wiggleMaxLength(self, nums: List[int]) -> int:
        #贪心算法
        #思路
        #如果当前nums数组长度=1的时候,连for循环都进不去的,这里不需要考虑nums的长度
        pre = 0 #前一个数字
        cur = 0 #当前数字
        result = 1 #记录有几个峰值
        for i in range(len(nums)-1):
            cur = nums[i+1]-nums[i]
            if cur*pre<=0 and cur!=0:
                #if的条件是 当前的不等于0,如果满足他们的乘积<=0而且当前不等于0 
                #那么就是一个子序列 然后result+=1,pre就更新为上一次的差值 
                result+=1
                pre = cur 
        return result

是不是觉得,看代码倒很容易能理解这个思路,然后打死也想不到这个叫做贪心算法。。。。。

Leecode53

力扣

这道题。。。21年的12月份做过,那个时候稀里糊涂的ac了完全不知道这个叫做贪心???

大概思路:设置一个最小值,for循环遍历每个数字,然后result+=nums[i],如果新的和求出来大于上一次的value,那么就更新,如果是<=0的,那么就重新设置为0,毕竟我们要求最大的和,肯定不能是负数,所以当我们连续相加之后都是负数的话,那就要重新更新当前i的位置,然后result重新设置为0 ,重新开始计算。

代码:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值