持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情
一、题目描述:
车上最初有 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 <= 10^5
二、思路分析:
- 提议可以判断出来:如要对区间频繁操作。区间的频繁操作考虑使用差分法
- 需要求出某个区间的乘客的数量: 定义一个差分数组。diff[区间start] +=乘客数量,diff[区间end] -=乘客数量。 遍历所有二维数组,那么可以求出差分数组
- 对差分数组进行遍历,求前缀和,然后判断每一个前缀和的值,如果大于设定的Capacity 返回false.否则返回true.
- 可以把二维数组的反复求和转化为o(n)复杂度算法。提高计算效率 需要注意的点: 1:差分数组的定义以及边界的定义
- 前缀和数组的求和,以及比较要从0位开始比较。preSum[i-1]
三、AC 代码:
#define MAXNUM 1001
bool carPooling(int** trips, int tripsSize, int* tripsColSize, int capacity){
//区间操作:1,5 上两个乘客 +2;3,7上3个乘客,+3,如果任何一个区间的乘客数量大于Capacity 说明无法承接现有的乘客,return false
// define Diff array
int* diff = (int*)calloc(MAXNUM,sizeof(int));
for(int i = 0;i<tripsSize;i++){
diff[trips[i][1]] += trips[i][0];
diff[trips[i][2]] -= trips[i][0];
}
int* preSum = (int*)calloc(MAXNUM +1,sizeof(int));
preSum[0] = diff[0];
for(int i = 1;i < MAXNUM;i++){
preSum[i] = preSum[i - 1] + diff[i];
if(preSum[i-1] > capacity) return false;
}
return true;
}