1、加油站
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
cur = 0 # 当前油量
total = 0 # 跑完一圈耗油量
start = 0
# 模拟从i号加油站出发的情况
for i in range(len(gas)):
cur += gas[i] - cost[i]
total += gas[i] - cost[i]
# 跑到一半没油了,说明肯定不在第i号出发,试试i+1
if cur < 0:
start = i+1
cur = 0
# 如果总油量小于总耗油量,不可能完成一圈
if total < 0: return -1
return start
2、分发糖果
class Solution:
def candy(self, ratings: List[int]) -> int:
if len(ratings) == 1: return 1
result = [1]*len(ratings)
for i in range(1,len(ratings)): # 从左向右遍历
if ratings[i] > ratings[i-1]: # 如果右边比左边表现好,+1
result[i] = result[i-1] + 1
for i in range(len(ratings)-2,-1,-1): # 从右向左遍历
if ratings[i] > ratings[i+1]: # 如果左边比右边表现好
result[i] = max(result[i],result[i+1]+1) # 所得糖果
return sum(result)
3、柠檬水
class Solution:
def lemonadeChange(self, bills: List[int]) -> bool:
five = 0
ten = 0
for i in bills:
if i == 5: # 如果收入5元
five += 1 # 不用找零,5元+1
elif i == 10: # 如果收入十元
if five < 1 : return False # 没有五元找
five -= 1 # 找五元
ten += 1 # 收入十元
elif i == 20: # 收入20
if ten > 0 and five > 0: # 优先找零一张十块一张5块
ten -= 1
five -= 1
elif five > 2: # 没有十元就找三张五元
five -= 3
else: return False
return True
4、根据身高重建队列
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
# 先按照h维度的身高顺序从高到低排序。确定第一个维度
# 当h相同时,再根据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