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