假设你是一位顺风车司机,车上最初有 capacity 个空座位可以用来载客。由于道路的限制,车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向,你可以将其想象为一个向量)。
这儿有一份乘客行程计划表 trips[][],其中 trips[i] = [num_passengers, start_location, end_location] 包含了第 i 组乘客的行程信息:
必须接送的乘客数量;
乘客的上车地点;
以及乘客的下车地点。
这些给出的地点位置是从你的 初始 出发位置向前行驶到这些地点所需的距离(它们一定在你的行驶方向上)。
请你根据给出的行程计划表和车子的座位数,来判断你的车是否可以顺利完成接送所有乘客的任务(当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false)。
示例 1:
输入:trips = [[2,1,5],[3,3,7]], capacity = 4
输出:false
示例 2:
输入:trips = [[2,1,5],[3,3,7]], capacity = 5
输出:true
示例 3:
输入:trips = [[2,1,5],[3,5,7]], capacity = 3
输出:true
示例 4:
输入:trips = [[3,2,7],[3,7,9],[8,3,9]], capacity = 11
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/car-pooling
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
package 差分数组;
//差分数组工具类
class Difference{
//差分数组
private int[] diff;
//构造函数,传入一个初始数组,区间操作将在这个数组上进行
Difference(int[] nums){
diff=new int[nums.length];
diff[0]=nums[0];
for(int i=1; i<nums.length;i++) {
diff[i]=nums[i]-nums[i-1]; //原始数组的前一个减后一个
}
}
//给闭区间[i,j]增加val (可以是负数)
public int[] increment(int i,int j,int var) {
diff[i]+=var;
if(j+1<diff.length)
diff[j+1]-=var;
return diff;
}
//返回结果数组
public int[] result() {
int[] res=new int[diff.length];
res[0]=diff[0];
for(int i=1; i<diff.length; i++) {
res[i]=res[i-1]+diff[i];
}
return res;
}
}
public class LeetCode_1094_拼车 {
public static void main(String[] args) {
int[] nums=new int[21];
int capacity=4;
int[][] trips=new int[][] {
{2,1,5},{3,3,7},{1,2,3},{4,9,16},{6,6,19}};
printArr(nums,"原始数组:");
Difference df=new Difference(nums);
for(int[] trip : trips) {
int s=trip[1];
int e=trip[2];
int val=trip[0];
printArr(df.increment(s, e, val)," 过程数组:");
}
printArr(df.result(),"结果数组:");
}
public static void printArr(int[] nums, String str) {
System.out.print(str);
for(int i=0; i<nums.length; i++)
System.out.print(nums[i]+" ");
System.out.println();
}
}