摘要:对数组执行前缀和操作得到「前缀和」数组,对「前缀和」数组执行「差分」操作得到「原始数组」。本题通过「输入数据」在「差分数组」上的操作,进而求解「前缀和」数组,得到「原始数组」。
差分知识点
输入数组:
定义「差分数组」:,数组 的前缀和就是数组 。
给数组 的区间 [left..right] 每个数都加上 ,数组 的数值发生变化的只有: 和 。这是因为:
- ,有变化。
- ,有变化。
其余 , 的元素都没有变化,这是因为
,都没有变化。
注意:差分数组的最后一个数不能要。
理解题意:
输入数组和输出数组可以通过下面的图来理解题意。
解题思路:
本题通过「输入数据」在「差分数组」上的操作,进而求解「前缀和」数组,得到「原始数组」。
参考代码:
public class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int[] nums = new int[n];
for (int[] booking : bookings) {
nums[booking[0] - 1] += booking[2];
if (booking[1] < n) {
nums[booking[1]] -= booking[2];
}
}
for (int i = 1; i < n; i++) {
nums[i] += nums[i - 1];
}
return nums;
}
}
这里要注意两个细节:
- 细节 1:处理左边界的时候,下标有一个偏移,所以是
nums[booking[0] - 1] += booking[2]; - 细节 2:处理右边界的时候,由于处理的是
right + 1,所以不用减 (这里没有说得很清楚,相信大家可以明白意思)。
我讲解的算法特别适合新手朋友。欢迎大家关注我的公众号「算法不好玩」,B 站关注「liweiwei1419」。