代码随想录算法训练营第二十九天| leetcode134. 加油站、leetcode135.分发糖果、leetcode860.柠檬水找零、leetcode406.根据身高重建队列

1 leetcode134. 加油站

题目链接:134. 加油站 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站_哔哩哔哩_bilibili

思路:其实这道题我有思路了,但是不知道怎么写,感觉太暴力了,就是找到花费最小的那个位置且汽油足够往下走的地方,开始走,然后循环,写的话,我不知道怎么写了,只能看视频了

1.1 视频后的思路

嗯,感觉自己把这个想复杂了,没有想到局部变量和全局变量的关系

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        cursum=0
        totalsum = 0
        start = 0
        for i in range(len(gas)):
            cursum +=gas[i]-cost[i]
            totalsum += gas[i] - cost[i]
            if cursum<0:
                cursum = 0
                start = i+1
        if totalsum<0:
            return -1
        return start

1.2 本题小结

  1. 这道题目就是没想到用全局和局部来统计,就卡住了,不知道怎么往后面写能把题目写出来
  2. 其实贪心主要问题还是局部最优和全局最优应该怎么找,很多时候会忘记这个

2 leetcode135.分发糖果

题目链接:135. 分发糖果 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果_哔哩哔哩_bilibili

思路:有一种之前做题目,找这个数据是不是摆动数的思路,但是写的话我不知道怎么写

2.1 视频后的思路

写的时候,自己忘了左边比右边大的情况,要对这个数值求最大值的操作,这里自己写的时候也出了一点小Bug

class Solution:
    def candy(self, ratings: List[int]) -> int:
        candy_l = [1]*len(ratings)
        for i in range(1,len(ratings)):
            if ratings[i]>ratings[i-1]:
                candy_l[i] = candy_l[i-1]+1
        for i in range(len(ratings)-2,-1,-1):
            if ratings[i+1]<ratings[i]:
                candy_l[i] = max(candy_l[i+1]+1,candy_l[i])
        return sum(candy_l)

2.2 本题小结

  1. 每次一到那种倒序遍历的时候,就很容易超出索引,我的想法,证明练习的题目还是不够多,需要再加强
  2. 这道题开始真的想的是,如何使用左右两边比较,摆动数列的方法来写,后来发现吧有点行不通

3 leetcode860.柠檬水找零

题目链接:860. 柠檬水找零 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零_哔哩哔哩_bilibili

思路:就是局部找最优,最后如果没有的话,就进行删除的操作,代码有些复杂,但是实现了

3.1 自己的方法

其实应该可以简化的,但是思路应该就是这样的了

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        money_num = []
        for i in range(len(bills)):
            money_num.append(bills[i])
            if bills[i]==10:
                if 5 in money_num:
                    money_num.remove(5)
                else:
                    return False
            elif bills[i] == 20:
                count_file = money_num.count(5)
                if (5 in money_num) and (10 in money_num):
                    money_num.remove(5)
                    money_num.remove(10)
                elif count_file>=3:
                    for i in range(3):
                        money_num.remove(5)
                else:
                    return False
        return True

3.2 视频后的方法

这个方法的代码,优点在于统计就可以节省很多空间了,但是思路和我之前的想法其实是一样的

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        five = 0
        ten = 0
        for i in bills:
            if i == 5:
                five +=1
            if i==10:
                if five == 0:
                    return False
                five-=1
                ten +=1
            if i==20:
                if five>0 and ten>0:
                    five -=1
                    ten -=1
                elif five>=3:
                    five-=3
                else:
                    return False
        return True

3.3 本题小结

  1. 终于自己写出来一道题目啦,但是我的思路有一点点复杂
  2. 其实这个用计数统计的方法和用数列的方法是一模一样的,所以两者都行的通

4 leetcode406.根据身高重建队列

题目链接:406. 根据身高重建队列 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:贪心算法,不要两边一起贪,会顾此失彼 | LeetCode:406.根据身高重建队列_哔哩哔哩_bilibili

思路:二维的数,瞬间没思路了,,,,

4.1 视频后的方法

听了,我明白了为什么,但是呢,还是不知道怎么写,懵逼

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda x:(-x[0],x[1]))
        que = []
        for i in people:
            que.insert(i[1],i)
        return que

4.2 本题小结

  1. 题目简单确实很简单,但是呢,思路还是不好想,首先就是看到了二维数组,我就不会了,就不知道怎么写了
  2. 一个匿名函数的定义方法key=lambda x:函数
  3. 二维数组的知识,就有一种增加了一个维度,我就彻底蒙蔽了的感觉

5 今日小结

  1. 首先自己尝试写出来了一道题目,这是一种进步吧,希望继续可以保持下去
  2. 二维数组的题目,时常是搞不清维度就不知道怎么往后去开发了,但是看了讲解以后,我好像就明白了为什么
  3. 贪心的题目,主要思路就是从局部最优中找到全局最优,根据这个思路很多题目就可以做出来
posted @   小方呀0524  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示