LeetCode 860.柠檬水找零
题目/文章/视频链接:860.柠檬水找零
看完代码随想录的想法:
这道题情况少,可以依次单独判断,在第三种情况下可以使用贪心算法,局部最优是优先用10的找零,这样可以拥有更多的5来方便后面的找零
敲代码过程的困难:
分别写对应三种情况的处理对策时,第三种稍微有点复杂,容易马虎
实际代码:
class Solution:
def lemonadeChange(self, bills: List[int]) -> bool:
five, ten = 0, 0
for bill in bills:
if bill == 5:
five += 1
elif bill == 10:
if five < 1: return False
five -= 1
ten += 1
else:
if ten > 0 and five > 0:
ten -= 1
five -= 1
elif five > 2:
five -= 3
else:
return False
return True
LeetCode 406.根据身高重建队列
题目/文章/视频链接:406.根据身高重建队列
看完代码随想录的想法:
这跟之前的分发糖果类似,需要先处理一边后再处理另一边,先按照身高从高到低排序,这样的话处理另一边时就可以直接按照数值直接对应位置插入即可
敲代码过程的困难:
Python中的排序和插入复杂操作运用的还是不太熟练
实际代码:
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
LeetCode 452. 用最少数量的箭引爆气球
题目/文章/视频链接:452.用最少数量的箭引爆气球
看完代码随想录的想法:
运用了重叠区间的用法,是这道题的关键点,处理好重叠区间后就能实现局部最优
敲代码过程的困难:
Python中的sort复杂操作还需要重复熟练
实际代码:
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if len(points) == 0: return 0
points.sort(key=lambda x: x[0])
result = 1
for i in range(1, len(points)):
if points[i][0] > points[i - 1][1]: # 气球i和气球i-1不挨着,注意这里不是>=
result += 1
else:
points[i][1] = min(points[i - 1][1], points[i][1]) # 更新重叠气球最小右边界
return result
今日收获:
今天学习了经典的贪心算法中的处理一边再处理另一边、重叠区间的用法,贪心算法确实没有明显的规律可循,没有基本套路,今日学习1.5h!