前缀和
适用于查询某个区间内所有元素之和
class NumArray {
// 前缀和数组
private int[] preSum;
/* 输入一个数组,构造前缀和 */
public NumArray(int[] nums) {
// preSum[0] = 0,便于计算累加和
preSum = new int[nums.length + 1];
// 计算 nums 的累加和
for (int i = 1; i < preSum.length; i++) {
preSum[i] = preSum[i - 1] + nums[i - 1];
}
}
/* 查询闭区间 [left, right] 的累加和 */
public int sumRange(int left, int right) {
return preSum[right + 1] - preSum[left];
}
}
差分数组
class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int diff[]=new int[n];
for(int i=0;i<bookings.length;i++){
int left=bookings[i][0];
int right=bookings[i][1];
int cha=bookings[i][2];
diff[left-1]+=cha;
if(right<n)
diff[right]-=cha;
}
int res[]=new int[n];res[0]=diff[0];
for(int i=1;i<n;i++){
res[i]=res[i-1]+diff[i];
}
return res;
}
}