代码随想录贪心算法part03|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
- 134. 加油站【太牛了】
- 135. 分发糖果
- 860.柠檬水找零
- 406.根据身高重建队列
134. 加油站【太牛了】
leetcode题目链接
代码随想录文档讲解
思路
:
两个数组:
gas
cost
diff(当前站点的的累计剩余油量)
新建变量:currsum,一旦它小于0,就从它的下一个站点开始重新记,因为这个站点前面的currsum是大于0的,舍弃前面的站点不会起作用,即前面哪一个站点作为起始站点都不行,尝试i+1。
视频有一堆很牛的反证法证明了我疑惑的地方(区间1+区间2<0,但区间1<0,区间2>0,这个时候已经选取区间1后的第一个位置作为起始点了,而不是区间2后的第一个位置,符合解题逻辑)
python代码
:
class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:currsum, totalsum, index = 0, 0, 0for i in range(len(gas)):currsum += gas[i] - cost[i]totalsum += gas[i] - cost[i]if currsum < 0:index = i + 1currsum = 0if totalsum < 0:return -1else:return index
135. 分发糖果
leetcode题目链接
代码随想录文档讲解
左右分别判断
class Solution:def candy(self, ratings: List[int]) -> int:candy = [1 for i in range(len(ratings))]for i in range(1, len(ratings)):if ratings[i] > ratings[i-1]:candy[i] = candy[i-1] + 1for i in range(len(ratings)-2, -1, -1):if ratings[i] > ratings[i+1]:candy[i] = max(candy[i], candy[i+1] + 1)return sum(candy)
860.柠檬水找零
leetcode题目链接
代码随想录文档讲解
贪心策略:优先用大的钞票找零
情况1: 支付5元
情况2: 支付10元(找零5元)
情况3: 支付20元(两种找零策略,优先使用10元+5元)
class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five, ten, twenty = 0, 0, 0for bill in bills:if bill == 5:five += 1if bill == 10:if five <= 0:return Falseelse:ten += 1five -= 1if bill == 20:if ten > 0 and five > 0:ten -= 1five -= 1twenty += 1elif five >= 3:five -= 3twenty += 1else:return Falsereturn True
406.根据身高重建队列
leetcode题目链接
代码随想录文档讲解
与分发糖果类似,本题也有两个维度:h、k,先确定一个维度再确定另一个维度
先从大到小排序h,确定好身高顺序,再遍历检查k,让队列满足k的熟悉(将身高小的插入到前面,这样也不会影响身高大的的位置)
使用python的sorted函数,使用lambda表达式,key确定排序依据,例如:
# 假设这是你的列表
my_list = [[1, 5], [3, 2], [4, 8], [2, 3]]# 根据每个小列表的第二个数字降序排序
sorted_list = sorted(my_list, key=lambda x: x[1], reverse=True)print(sorted_list)
在写按照k进行排序插入的代码时也不用再计算应该插入的位置,其实就是插入到第k个位置,因为已经排好序了,这里又蠢了呜呜
class Solution:def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:# 先按照h维度的身高顺序从高到低排序。确定第一个维度# lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序people.sort(key=lambda x: (-x[0], x[1]))que = []# 根据每个元素的第二个维度k,贪心算法,进行插入# people已经排序过了:同一高度时k值小的排前面。for p in people:que.insert(p[1], p)return que