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