class Difference {
// 差分数组
private int[] diff;
/* 输⼊⼀个初始数组,区间操作将在这个数组上进⾏ */
public Difference(int[] nums) {
assert nums.length > 0;
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 void increment(int i, int j, int val) {
diff[i] += val;
if (j + 1 < diff.length) {
diff[j + 1] -= val;
}
}
/* 返回结果数组 */
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;
}
}
在做区间加法,假设你有⼀个⻓度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k 个更新的操作。 其中,每个操作会被表示为⼀个三元组:[startIndex, endIndex, inc],你需要将⼦数 组 A[startIndex ... endIndex](包括 startIndex 和 endIndex)增加 inc。 请你返回 k 次操作后的数组。类似的题目有航班预定和拼车等等
1094拼车
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
int[] nums=new int[1001];
// 构造差分解法
Difference df=new Difference(nums);
for(int[] trip:trips){
int val=trip[0];
int i=trip[1];
int j=trip[2]-1;// 第 trip[2] 站乘客已经下⻋,
// 即乘客在⻋上的区间是 [trip[1], trip[2] - 1]
df.increment(i,j,val);
}
int[] res=df.result();
for(int i=0;i<res.length;i++){
if(res[i]>capacity){
return false;
}
}
return true;
}
}