860. 柠檬水找零
solution
不要漏掉的一种情况是:如果收到了20,可以找10+5,或者5+5+5
class Solution:
def lemonadeChange(self, bills: List[int]) -> bool:
mymoney=dict()
mymoney[5]=0
mymoney[10]=0
mymoney[20]=0
for i in bills:
mymoney[i]+=1
needreturn=i-5
# 需要找零的币种只有:5 或者 15(10+5 or 5+5+5)
if needreturn==5:
if mymoney[5]>0:mymoney[5]-=1
else:return False
elif needreturn==15:
if mymoney[10]>0 and mymoney[5]>0:
mymoney[10]-=1
mymoney[5]-=1
elif mymoney[5]>=3:
mymoney[5]-=3
else:return False
for e,i in enumerate(mymoney):
if i>=0:continue
else:return False
return True
406. 根据身高重建队列
遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。如果两个维度一起考虑一定会顾此失彼。
链接: lambda表达式在sort中的使用
链接: 如何使用python insert插入数据
solution
抄的代码,注意看我写的注释
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
# 先按照h维度的身高顺序从高到低排序。确定第一个维度
# lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序
# lambda默认是看参数x 从小到大,前面加上-就是从大到小
people.sort(key=lambda x: (-x[0], x[1]))
que = []
# 根据每个元素的第二个维度k,贪心算法,进行插入
# 因为从前往后插入,越往后是身高小的,插在前面不会影响已经插好的元素的k属性
# people已经排序过了:同一高度时k值小的排前面。
for p in people:
que.insert(p[1], p)
return que
452. 用最少数量的箭引爆气球
solution
我直接看了答案再写的 好聪明啊卡尔
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
res=1 # initial 1
points.sort(key=lambda x:x[0])
print(points)
for i in range(1,len(points)):
if points[i][0]>points[i-1][1]:res+=1
else:
points[i][1]=min(points[i][1],points[i-1][1])
return res
- 排序后从第二个范围开始,如果它的区间头比前一个尾巴小,即与前一个重合,那么就将改区间尾巴位置为相对小的尾巴,表示已经被射击了
- 如果没有重叠,则需要一只新的剑了