455.发饼干
class Solution:#大饼干优先
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()#将孩子的贪心因子排序
s.sort()#将饼干的尺寸排序
index=len(s)-1
result=0
for i in range(len(g)-1,-1,-1):#遍历胃口,从最后一个孩子开始
if index>=0 and s[index]>=g[i]:
result+=1
index-=1
return result
class Solution:#小饼干优先
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()#将孩子的贪心因子排序
s.sort()#将饼干的尺寸排序
index=0
for i in range(len(s)):#遍历饼干
if index<len(g) and g[index]<=s[i]:
index+=1
return index
376.摆动序列
我们思考本题的一个大题思路,但本题要考虑三种情况:
- 情况一:上下坡中有平坡
- 情况二:数组首尾两端(可以假设数组前面还有一个元素)
- 情况三:单调坡中有平坡( 单调中的平坡 不能算峰值(即摆动))
因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)
题目中说了,如果只有两个不同的元素,那摆动序列也是 2
只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。
本题异常情况的本质,就是要考虑平坡, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
if len(nums)<=1:
return len(nums)#如果数组长度为0或1,直接返回
curdiff=0#当前元素的差值
prediff=0#前一对元素的差值
result=1#记录峰值的个数,初始为1(默认最右边的元素为峰值)
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):
result+=1#峰值个数加一
prediff=curdiff#只有摆动变化的时候更新prediff,预防单调坡度有平波
return result
53.最大子序和
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
result=float("-inf")
count=0
for i in range(len(nums)):
count+=nums[i]
if count>result:
result=count
if count<=0:
count=0#这种做法相当于重置最大子序的起始位置,因为遇到负数一定是拉低总和
return result