代码随想录算法训练营第二十七天| leetcode455.分发饼干、leetcode2410. 运动员和训练师的最大匹配数、leetcode376. 摆动序列、leetcode53. 最大子序和

1 leetcode455.分发饼干

题目链接:455. 分发饼干 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:贪心算法,寻找摆动有细节!| 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 本题小结

  1. 这道题的核心就是全部遍历,然后去分配
  2. 一周没刷题,看了觉得还是亲切呀

2 leetcode376. 摆动序列

题目链接:376. 摆动序列 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:贪心算法,寻找摆动有细节!| 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 本题小结

  1. 确实没想到直接去统计这个计算结果,也忘记了之前常用的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 本题小结

  1. 主要就是如何看全局最优和局部最优吧,感觉没学到精髓,需要更加努力去做好呀
  2. 题目真的没有我想的那么夸张,觉得难得不得了

4今日小结

  1. 贪心算法的核心,就是局部最优推理出全局最优,这是这个方法的核心所在,主要掌握了这个,其他的就都还好说啦
  2. 方法确实不难,主要就是思维的一个掌握吧
posted @ 2024-11-24 13:47  小方呀0524  阅读(5)  评论(0编辑  收藏  举报