一、 题目
1. 题目描述
车上最初有 capacity
个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)
给定整数 capacity
和一个数组 trips
, trip[i] = [numPassengersi, fromi, toi]
表示第 i
次旅行有 numPassengersi
乘客,接他们和放他们的位置分别是 fromi
和 toi
。这些位置是从汽车的初始位置向东的公里数。
当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true
,否则请返回 false
。
示例 1:
输入:trips = [[2,1,5],[3,3,7]], capacity = 4
输出:false
示例 2:
输入:trips = [[2,1,5],[3,3,7]], capacity = 5
输出:true
提示:
1 <= trips.length <= 1000
trips[i].length == 3
1 <= numPassengersi <= 100
0 <= fromi < toi <= 1000
1 <= capacity <= 105
Related Topics
- 数组
- 前缀和
- 排序
- 模拟
- 堆(优先队列)
- 👍 182
- 👎 0
2. 原题链接
链接: 1094. 拼车
二、 解题报告
1. 思路分析
trip的作用:某个路程点上一部分人,某个路程点下一部分人。在这个区间,这些人会一直在车上。
那么其实就是IUPQ,用线段树询问所有区间的max就行
2. 复杂度分析
最坏时间复杂度O(nlog2n)
3. 代码实现
线段树
。
class IntervalTree:
def __init__(self):
self.interval_tree = collections.defaultdict(int)
self.lazys = collections.defaultdict(int)
def give_lay_to_son(self,p,l,r):
interval_tree = self.interval_tree
lazys = self.lazys
if lazys[p] == 0:
return
mid = (l+r)//2
interval_tree[p*2] += lazys[p]
interval_tree[p*2+1] += lazys[p]
lazys[p*2] += lazys[p]
lazys[p*2+1] += lazys[p]
lazys[p] = 0
def add(self,p,l,r,x,y,val):
"""
把[x,y]区域全+val
"""
if r < x or y < l: # 这里不加就会TLE
return
interval_tree = self.interval_tree
lazys = self.lazys
if x <= l and r<=y:
interval_tree[p] += val
lazys[p] += val
return
self.give_lay_to_son(p,l,r)
mid = (l+r)//2
if x <= mid:
self.add(p*2,l,mid,x,y,val)
if mid < y:
self.add(p*2+1,mid+1,r,x,y,val)
interval_tree[p] = max(interval_tree[p*2], interval_tree[p*2+1])
def query(self,p,l,r,x,y):
"""
查找x,y区间的最大值
"""
if x<=l and r<=y:
return self.interval_tree[p]
self.give_lay_to_son(p,l,r)
mid = (l+r)//2
s = 0
if x <= mid:
s = max(s,self.query(p*2,l,mid,x,y))
if mid < y:
s = max(s,self.query(p*2+1,mid+1,r,x,y))
return s
class Solution:
def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
tree = IntervalTree()
for numPassengers,from_,to in trips:
tree.add(1,1,1005,from_+1,to,numPassengers)
if tree.interval_tree[1] > capacity:
return False
return True
三、 本题小结
- 线段树的IUPQ模型,这也可以用差分数组做。
四、 参考链接
- 链接: [python刷题模板] 线段树