455. 分发饼干
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
i = 0
j = 0
result = 0
while(i < len(g) and j < len(s)):
if g[i] <= s[j]:
result += 1
i += 1
j += 1
elif g[i] > s[j]:
j += 1
return result
贪心的思路就是局部最优到全局最优;本题局部最优就是让当前的小朋友吃到满足其胃口的当前的最小尺寸,所以一开始需要都排个序。然后同时遍历
376. 摆动序列
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
if len(nums) < 2:
return 1
result = 1
for i in range(len(nums) - 1):
if i == 0:
pre_diff = 0
cur_diff = nums[i + 1] - nums[i]
if (pre_diff >=0 and cur_diff < 0) or (pre_diff <=0 and cur_diff > 0):
result += 1
pre_diff = cur_diff
return result
关键在于pre_diff的计算,不能每次都算,因为如果碰到单调有平坡的情况,也会result+1。所以应该在有峰值转换的适合让pre_diff = cur_diff。 否则就保持pre_diff的方向不变。
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
用count来初始化起始位置,如果count小于零,那么count等于0,即每次都从新的位置开始算,因为如果从当前位置算 肯定没有从新的位置算来的小。