车上最初有 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
思路:差分数组(注意:[2,1,5]代表2个人从1公里处上车,5公里处下车——数组从1到4加2)
[[2,1,5],[3,3,7]] ,capacity = 4
1 2 3 4 5 6 7
2 2 2 2
3 3 3 3
2 2 5 5 3 3 0
5>4,故不能接送所有乘客
class Solution {
public:
bool carPooling(vector<vector<int>>& trips, int capacity)
{
vector<int> v(1001,0);//0<=fromi<toi<=1000
for(vector<int> trip:trips)//构造差分数组
{
int passenger=trip[0];
int left=trip[1];
int right=trip[2];
v[left]+=passenger;
if(right<1000)
{
v[right]-=passenger;
}
}
vector<int> res(1001,0);
res[0]=v[0];
for(int i=1;i<v.size();i++)//由差分数组倒退结果数组
{
res[i]=res[i-1]+v[i];
}
for(int i:res)
{
if(i>capacity)
{
return false;
}
}
return true;
}
};