主要内容
贪心题目
860. 柠檬水找零
思路分析
如果需要找零,先找10,再找5
代码
class Solution:
def lemonadeChange(self, bills: List[int]) -> bool:
d = dict()
d[5]=0
d[10]=0
d[20]=0
for b in bills:
if b == 5:
d[5] += 1
elif b == 10:
if d[5] <= 0:
return False
else:
d[5] -= 1
d[10] += 1
elif b == 20:
if d[5] >= 3 or (d[5] >= 1 and d[10] >= 1):
if d[5] >= 1 and d[10] >= 1:
d[10] -= 1
d[5] -= 1
else:
d[5] -= 3
d[20] += 1
else:
return False
return True
406. 根据身高重建队列
思路分析
非常巧妙的解法,两个维度h,k,先排一个维度,再排另一个维度
按身高从大到小排,依次插入
身高高的先插入,不会影响后面身高小的再插入
代码
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
# 两个维度的排序
# 先按身高h从大到小排,身高相同按k从小到大排
people.sort(key = lambda x: (-x[0],x[1]))
que = []
for p in people:
que.insert(p[1],p)
return que
452. 用最少数量的箭引爆气球
思路分析
射中后更新重叠边界
代码
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
# 先按start排个序
points.sort(key = lambda x: x[0])
result = 1
for i in range(1, len(points)):
if points[i][0] > points[i-1][1]:
# 当前气球的start未与上一重叠气球的末边界重合
result += 1
else:
# 更新重叠气球末边界
points[i][1] = min(points[i][1], points[i-1][1])
return result