看题目:
这题我们使用差分数组技巧来解题。
不知道差分数组啥意思的可以看->差分数组技巧详解
审题:
坐位数不固定,上下车地点还有人数也不固定。
这就相当于是给了一个初始值全为0(座位开始都是空着)的数组,数组长度由最大的to决定(最后下车的人坐的距离)。题目给定 0 <= from < to <= 1000 ,那么 0 <= to <= 1000 .
所以我们就可以给定初始数组 int[1001]
接着对差分数组操作上车下车,也就是对区间内的数据操作加减,最后推导出结果数组,循环判断是否超出坐位数量,如果有超出的,则不成立。
需要注意的是,操作to的时候,要考虑清楚,下车人是先下车后上车。
下面是Java代码:
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
int[] nums = new int[1001];
int toMax = 0; //用于标识最后一个下车的人的下标
for(int i = 0; i < trips.length; i++){
int num = trips[i][0];
int from = trips[i][1];
int to = trips[i][2];
if(to > toMax){
toMax = to;
}
nums[from] += num;
//if(to+1 < nums.length){
//nums[to+1] -= num; 不用to+1,因为拼车这个在下车先下人,然后再上人。
if(to < nums.length){
nums[to] -= num;
}
}
int[] res = new int[toMax+1];
res[0] = nums[0];
if(res[0] > capacity){ //始发站也要判断座位够不够
return false;
}
for(int i = 1; i < res.length; i++){
res[i] = res[i-1] + nums[i];
if(res[i] > capacity){
return false;
}
}
return true;
}
}