题目:
车上最初有 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
差分:
举例
考虑数组 a=[1,3,3,5,8],对其中的相邻元素两两作差(右边减左边),得到数组[2,0,2,3],然后在开头补上 a[0],得到差分数组
d=[1,2,0,2,3]
这有什么用呢?如果从左到右累加 d 中的元素,我们就「还原」回了 a 数组[1,3,3,5,8],这又有什么用呢?现在把连续子数组 a[1],a[2],a[3] 都加上 10,得到 a′=[1,13,13,15,8],再次两两作差,并在开头补上 a′[0],得到差分数组
d′=[1,12,0,2,−7]
对比 d 和 ′d′,你会发现,对 a 中连续子数组的操作,可以转变成对差分数组 d 中两个数的操作。
定义和性质
对于数组 a,定义其差分数组(difference array)为
性质 1:从左到右累加 d 中的元素,可以得到数组 a。
性质 2:如下两个操作是等价的。
区间操作:把 a 的子数组 a[i].....a[j]加上x
单点操作:把d[i]增加x,d[j+1]减去x,特别的:如果j+1==n则只需要把d[j]+x(n是a数组的长度)
利用性质 2,我们只需要 O(1) 的时间就可以完成数组 a 上的区间操作。最后利用性质 1 从差分数组复原出数组 a。
代码模板:
解题思路:
本题如果按照直接模拟的思路则很难求解。因为是求在距起点不同距离的过程中乘客的数量,只要在距起点某一个点的乘客的数量大于规定的乘客的数量就要返回false因此我们不妨使用差分的思路来求解。
a数组a[i]表示的是距起点距离为i的过程中车上游客的数量,有numPassengersi个游客在fromi上车在toi下车相当于将a[i],a[i+1],.....a[toi-1]加上numPassengersi.我们可以利用差分数组diff直接diff[fromi]
+ numPassengersi ,diff[toi]-numPassengersi(注意: 这里是toi而不是toi+1是因为乘客在距起点toi距离的地方下车了,此时乘客已经不再车上了,相当于是将a数组的a[fromi--toi]+numPassengersi)
最后我们无需复原数组a,只需要一个变量累计差分值,只要差分值>capacity则return false
否则最后return true;