860 柠檬水找零
创建一个字典记录手里有的5、10、20美元数量,然后依次遍历记录看能否顺利找零
和贪心有什么关系?
收到20美元时优先找10+5,没有才找5+5+5
class Solution:
def lemonadeChange(self, bills: List[int]) -> bool:
box = {5:0,10:0,20:0}
for i in range(len(bills)):
if bills[i] == 5:
box[5] += 1
elif bills[i] == 10:
if box.get(5) == 0:
return False
else:
box[5] -= 1
box[10] += 1
elif bills[i] == 20:
if box.get(10) == 0:
if box.get(5) <= 2:
return False
else:
box[5] -= 3
box[20] += 1
elif box.get(10) >= 1:
if box.get(5) == 0:
return False
else:
box[5] -= 1
box[10] -= 1
box[20] += 1
return True
通过了,不过时间不佳,其实可以直接用数组按顺序存储的,不需要字典//
改成数组反而耗时提高了。。
也不需要数组,直接三个变量会更快。。不过比较简单就不写了
406 根据身高重建队列
简直是我做过最难理解的题。。
首先一堆人站成一列,然后给了一个数组表示每个人的属性,要根据这个重排此数组中元素的顺序,使其与人群所站的顺序一致
属性包括两项,第一身高,第二前面有多少人等于或比他高
首先找到最矮的人,看它前面有几个人,据此就可以确定他们的位置
其次再找次矮的人
逻辑挺绕的,而且需要两个while
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
people = sorted(people)
queue = [0 for i in range(len(people))]
for p in people:
index = p[1]
pos = 0
n = 0
while pos < index:
if queue[n] == 0 or queue[n][0] >= p[0]:
pos += 1
n += 1
while queue[n] != 0:
n += 1
queue[n] = p
# print(queue)
return queue
看解答,发现是和我相反的思路,从大到小排,然后直接按照第二个属性插入即可,因为已经保证了前面有高的人,且人数和属性相等,这个逻辑比我要快不少,不用判断插入第几个,写一下试试
耗时降低了一个数量级
list.insert(pos,value) 插入元素使其位于pos所在的索引位置
452 用最少数量的箭引爆气球
这题有点意思,若两个区间有交集那么只需要交集一支箭可以射穿多个气球
集合覆盖问题
对point数组排序,先看第一个元素再看第二个元素
然后进行连续判断
刚学会的多元素排序函数
points.sort(key=lambda x: (x[0],x[1]))
排序后逐个判断,结果对但是超时了。。
看解答
解答中说,没有必要删除气球,只要记下射箭数量即可,巧妙地利用原数组记录了需要更新的右边边界
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if len(points) == 0: return 0
points.sort(key=lambda x: (x[0]))
L = len(points)
i = 0
arrow = 1
for i in range(1,L):
if points[i][0]> points[i-1][1]:
arrow += 1
else:
points[i][1] = min(points[i-1][1],points[i][1])
return arrow