题目
思路
读完题干后一个自然的思路就是模拟汽车的行驶过程,汽车行驶过程中会顺序经过每个站点,因此现将原数组按乘客上车地点升序排列。之后遍历数组,在遍历过程中每经过一个站点,就需要统计从上一站到该站下车的旅客有多少,先将下车的乘客数补回空座位,然后再判断当前站乘客是否能全部上车。统计下车乘客时有两种方法:一是遍历该站之前的所有站,对于还未处理过的站,判断当前上车地点是否已经过了该站对应的下车地点,这个算法的时间复杂度为O()。代码如下所示:
class Solution:
def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
trips.sort(key=lambda x:x[1])
flag=True
vis=[False for i in range(len(trips))] #标记每个站是否已经处理过
q=[]
start=0
for i,temp in enumerate(trips):
start=temp[1]
for j in range(i):
if not vis[j]:
if trips[j][2]<=start: #如果当前站已经过了之前某一站乘客的下车地点
capacity+=trips[j][0]
vis[j]=True
if capacity<temp[0]:
return False
break
capacity-=temp[0]
return True
在统计下车乘客时另一种更高效的方法是使用小根堆。将每一站乘客的下车地点和乘客人数作为堆的元素,并按下车地点排序,这样堆的第一个元素的下车地点就是最早下车的乘客的下车地点。循环判断直到当前堆的第一个元素大于当前距离,该算法的平均时间复杂度为O()代码如下:
class Solution:
def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
trips.sort(key=lambda x:x[1])
flag=True
##vis=[False for i in range(len(trips))]
q=[]
start=0
for i,temp in enumerate(trips):
start=temp[1]
while q:
if q[0][0]<=start:
capacity+=q[0][1]
heapq.heappop(q)
else:
break
if capacity<temp[0]:
return False
break
capacity-=temp[0]
heapq.heappush(q,[temp[2],temp[0]])
return True