打卡Day27
1.455.分发饼干
局部最优就是拿大饼干喂胃口大的小孩,全局最优就是喂饱尽可能多的小孩。先将饼干数组和小孩数组进行排序,然后从后向前遍历,用大饼干优先满足胃口大的,并统计满足的小孩数量。
class Solution(object):
def findContentChildren(self, g, s):
"""
:type g: List[int]
:type s: List[int]
:rtype: int
"""
count = 0
j = len(s) - 1
#排序
g.sort()
s.sort()
#遍历胃口
for i in range(len(g) - 1, -1, -1):
if j >= 0 and s[j] >= g[i]: # 要防止j溢出
count += 1
j -= 1
return count
也可以换个思路,先拿小饼干满足胃口小的孩子。
class Solution(object):
def findContentChildren(self, g, s):
"""
:type g: List[int]
:type s: List[int]
:rtype: int
"""
j = 0
g.sort()
s.sort()
#要遍历饼干,只有喂饱胃口小的孩子,才能进行喂饱下一个孩子
for i in range(len(s)):
if j < len(g) and s[i] >= g[j]:
j += 1
return j
2.376. 摆动序列
局部最优:删除单调坡度上的节点,那么这个坡度就会有两个局部峰值。定义两个变量来记录前后差值,prediff = nums[i] - nums[i-1],curdiff = nums[i+1] - nums[i],要么 prediff 小于0、curdiff 大于0,或者 prediff 大于0、curdiff 小于0。同时考虑到会有平坡的情况,只记录靠右的那个峰值,因此,判断条件变为要么 prediff 小于等于0、curdiff 大于0,或者 prediff 大于等于0、curdiff 小于0。本题统计峰值的时候,在数组最左边增加一段,例如,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0。默认结果从1开始,因为默认最右边有峰值。
还有第三种情况,那就是单调坡度中有平坡,例如[1,2,2,3,4],这样判断的时候会将第二个2计算进去,因为也满足prediff 小于等于0、curdiff 大于0。解决这个问题的办法,就是不让prediff实时跟着curdiff变化,在有坡度变化的时候再更新prediff。
class Solution(object):
def wiggleMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) <= 1:
return len(nums)
res = 1
prediff = 0
curdiff = 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
或者将判断条件改为:
if prediff * curdiff <= 0 and curdiff != 0:
3.53. 最大子序和
看讲解视频的时候,我发现进入误区了,一开始认为只要遇到负数就跳过,从下一个数开始计算连续和。正确的应该判断连续和是否为负,完整思路则是,初始化count = 0, 遍历过程,count先加上当前元素值,若大于res则替换,接着判断是否不为正数,若非正,则再次初始化count。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = float('-inf')
count = 0
for i in range(len(nums)):
count += nums[i]
if count > res:
res = count
if count <= 0 :
count = 0
return res
713

被折叠的 条评论
为什么被折叠?



