代码随想录算法训练营第二十七天| leetcode455.分发饼干、leetcode2410. 运动员和训练师的最大匹配数、leetcode376. 摆动序列、leetcode53. 最大子序和
1 leetcode455.分发饼干
文章链接:代码随想录
视频链接:贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列_哔哩哔哩_bilibili
思路:不会,真的有一点不知道从哪儿下手的感觉
1.1 视频后的思路
就是不断将大的饼干往外分发,最大的匹配最大的可以吃的那个孩子就可以完成了
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
index = len(s)-1
num = 0
for i in range(len(g)-1,-1,-1):
if index>=0 and s[index]>=g[i]:
num +=1
index -=1
return num
1.2 从小到大排序
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
index =0
num = 1
for i in range(len(s)):
if index<len(g) and s[i]>=g[index]:
index +=1
return index
1.3 相似题目:leetcode2410. 运动员和训练师的最大匹配数
真的就是思路一模一样,水灵灵的写出来咯
题目:2410. 运动员和训练师的最大匹配数 - 力扣(LeetCode)
class Solution:
def matchPlayersAndTrainers(self, players: List[int], trainers: List[int]) -> int:
players.sort()
trainers.sort()
index = len(trainers)-1
num = 0
for i in range(len(players)-1,-1,-1):
if index>=0 and trainers[index]>=players[i]:
num +=1
index-=1
return num
1.4 本题小结
- 这道题的核心就是全部遍历,然后去分配
- 一周没刷题,看了觉得还是亲切呀
2 leetcode376. 摆动序列
文章链接:代码随想录
视频链接:贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列_哔哩哔哩_bilibili
思路:不会,确实想不出来
2.1 视频后的思路
嗯,我确实没想到可以这样,才开始是觉得直接进行统计数据,最后返回数组的长度就好了
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
prediff = 0
curdiff = 0
result = 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
return result
2.2 看别人的方法后的思路
其实发现这个代码是可以进行优化一下的,然后就写成了这样,确实可以剪枝一下子,感觉会好一点点
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
if len(nums)<=1:
return len(nums)
prediff = 0
curdiff = 0
result = 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
return result
2.3 本题小结
- 确实没想到直接去统计这个计算结果,也忘记了之前常用的pre和cur的方式
3 leetcode53. 最大子序和
题目链接:53. 最大子数组和 - 力扣(LeetCode)
文章链接:代码随想录
视频链接:贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和_哔哩哔哩_bilibili
思路:我想着,遇到负数的后一个是正数就从正数的位置开始,不过没尝试,还是有点小bug
3.1 视频后的思路
看完视频,觉得思路和我的一样,但是我就是不敢尝试出问题了
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
3.2 本题小结
- 主要就是如何看全局最优和局部最优吧,感觉没学到精髓,需要更加努力去做好呀
- 题目真的没有我想的那么夸张,觉得难得不得了
4今日小结
- 贪心算法的核心,就是局部最优推理出全局最优,这是这个方法的核心所在,主要掌握了这个,其他的就都还好说啦
- 方法确实不难,主要就是思维的一个掌握吧