LeetCode-1094.拼车
题目描述
车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)
给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。
当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。
问题分析
由于车的位置范围为[0, 1000]
。因此,我们可以使用一个长度为 1000 的数组来记录每个位置的乘客数量。
先遍历trips
数组,利用差分数组的思想,修改某段区间。即若有 c 个乘客在 a 点上车,在 b 点下车,要对区间[a, b)
整体进行加 c 的操作,利用差分数组只需要进行nums[a] += c
和nums[b] -= c
操作即可。
求完差分数组后,对差分数组进行前缀和计算,就可以得到每个站点的乘客数量,与车的最大容量进行比较便可得到最终答案。
程序代码
cpp
class Solution {
public:
bool carPooling(vector<vector<int>>& trips, int capacity) {
vector<int> nums(1010, 0);
for(auto t : trips) {
nums[t[1]+1] += t[0];
nums[t[2]+1] -= t[0];
}
for(int i = 1; i <= 1000; i++) {
nums[i] += nums[i-1];
if(nums[i] > capacity) return false;
}
return true;
}
};