1 leetcode134. 加油站
题目链接:134. 加油站 - 力扣(LeetCode)
文章链接:代码随想录
视频链接:贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站_哔哩哔哩_bilibili
思路:其实这道题我有思路了,但是不知道怎么写,感觉太暴力了,就是找到花费最小的那个位置且汽油足够往下走的地方,开始走,然后循环,写的话,我不知道怎么写了,只能看视频了
1.1 视频后的思路
嗯,感觉自己把这个想复杂了,没有想到局部变量和全局变量的关系
class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:cursum=0totalsum = 0start = 0for i in range(len(gas)):cursum +=gas[i]-cost[i]totalsum += gas[i] - cost[i]if cursum<0:cursum = 0start = i+1if totalsum<0:return -1return start
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]+1for 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 本题小结
- 每次一到那种倒序遍历的时候,就很容易超出索引,我的想法,证明练习的题目还是不够多,需要再加强
- 这道题开始真的想的是,如何使用左右两边比较,摆动数列的方法来写,后来发现吧有点行不通
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 Falseelif 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 Falsereturn True
3.2 视频后的方法
这个方法的代码,优点在于统计就可以节省很多空间了,但是思路和我之前的想法其实是一样的
class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five = 0ten = 0for i in bills:if i == 5:five +=1if i==10:if five == 0:return Falsefive-=1ten +=1if i==20:if five>0 and ten>0:five -=1ten -=1elif five>=3:five-=3else:return Falsereturn True
3.3 本题小结
- 终于自己写出来一道题目啦,但是我的思路有一点点复杂
- 其实这个用计数统计的方法和用数列的方法是一模一样的,所以两者都行的通
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 本题小结
- 题目简单确实很简单,但是呢,思路还是不好想,首先就是看到了二维数组,我就不会了,就不知道怎么写了
- 一个匿名函数的定义方法
key=lambda x:函数
- 二维数组的知识,就有一种增加了一个维度,我就彻底蒙蔽了的感觉
5 今日小结
- 首先自己尝试写出来了一道题目,这是一种进步吧,希望继续可以保持下去
- 二维数组的题目,时常是搞不清维度就不知道怎么往后去开发了,但是看了讲解以后,我好像就明白了为什么
- 贪心的题目,主要思路就是从局部最优中找到全局最优,根据这个思路很多题目就可以做出来