https://leetcode-cn.com/problems/corporate-flight-bookings/
暴力解法就是遍历数组,然后再当前的小数组上继续遍历。复杂度比较大。
这里采用差分的思想。
新建一个数组,当前位置的数记录的是,当前位置与之前位置数据的差异(也就是:当前数-前一位置的数)。
一次遍历数组,就可构建出这个差分数组:
【i,j,n】表示i位置到j位置上的数都为n,那么此时只需要在差分数组的i位置上加n,表示i位置相比于i-
1位置增加了n;在j位置上减n,表示j相比于j-1减少了n。
构建完差分数组之后,遍历一遍差分数组,就可得到每个位置上的数。
class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] res = new int[n];
for(int i=0; i<bookings.length; i++){
res[bookings[i][0]-1] += bookings[i][2];
if(bookings[i][1]!=n){
res[bookings[i][1]] -= bookings[i][2];
}
}
for(int i=1; i<n; i++){
res[i] += res[i-1];
}
return res;
}
}
一些下标的细节需要注意