【代码随想录训练营】【Day 34】【贪心-1】| Leetcode 455,376, 53
需强化知识点
- 感受贪心和动规的差异
- 贪心:从局部最优到全局最优
题目
455. 分发饼干
- 思路:小饼干尝试先满足小胃口
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
result = 0
i, j = 0, 0
while i < len(s) and j < len(g):
if s[i] >= g[j]:
result += 1
i += 1
j += 1
else:
i += 1
return result
376. 摆动序列
- 注意 dp[i][0] = dp[i][1] = 1 每层的初始化,自身最起码都可以构成一个摆动序列
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
dp = [[0] * 2 for _ in range(len(nums))]
# i,0 为表示考虑前 i 个数,第 i 个数作为山谷的序列长度,i,1为山峰
dp[0][0], dp[0][1] = 1, 1
for i in range(1, len(nums)):
dp[i][0] = dp[i][1] = 1
for j in range(0, i):
if nums[i] > nums[j]:
dp[i][1] = max(dp[i][1], dp[j][0] + 1)
if nums[i] < nums[j]:
dp[i][0] = max(dp[i][0], dp[j][1] + 1)
return max(dp[len(nums)-1][0], dp[len(nums)-1][1])
53. 最大子数组和
- 递归:以当前 i 结尾的最大连续子数组和
- 贪心:当累计值为负数值,应立马抛弃,以接下来的值重新开始计数
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# dp = [0] * len(nums)
# dp[0] = nums[0]
# result = nums[0]
# for i in range(1, len(nums)):
# dp[i] = max(nums[i], dp[i-1] + nums[i])
# result = max(result, dp[i])
# return result
result = nums[0]
count = 0
for i in range(0, len(nums)):
count += nums[i]
result = max(result, count)
if count < 0:
count = 0
return result