一、题目描述
二、示例
三、难度
中等
四、理解
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
nums(初始) | 5 | 8 | 7 | 4 | 6 | 2 | 9 |
i>0,diff[i] = nums[i] - nums[i-1] | 5 | 3 | -1 | -3 | 2 | -4 | 7 |
res[i] = diff[i] + res[i-1] | 5 | 8 | 7 | 4 | 6 | 2 | 9 |
若要使区间[2,4]的元素加2,根据用diff反推nums(res[i] = diff[i] + res[i-1])可知,对nums的区间所有元素增减操作,可在diff上进行,再反推
1. diff[2] + 2时,根据反推说明给 nums[2…] 所有的元素都加了 2
2. 要求只在[2,4]上的元素+2,则将diff[5] - 2即可
五、代码
Java版(差分数组)
/**
* @author Kidd
* @create 2022-04-19 20:00
*/
public class Solution {
private int[] diff;
public int[] getModifiedArray(int[][] updates, int length) {
//初始化数组元素都为0
int[] nums = new int[length];
diff = new int[length];
//构造差分数组
//因nums[0]前面没有元素,认为其为0,实际上diff[0] = nums[0] - 0
diff[0] = nums[0];
for (int i = 1; i < length; ++i) {
diff[i] = nums[i] - nums[i - 1];
}
for(int[] outer : updates) {
diff[outer[0]] += outer[2];
if(outer[1] + 1 < length)
diff[outer[1] + 1] -= outer[2];
}
//存放最终数组
int[] res = new int[diff.length];
res[0] = diff[0];
for (int i = 1; i < length; ++i) {
res[i] = res[i - 1] + diff[i];
}
return res;
}
public static void main(String[] args) {
int length = 5;
int[][] updates = {
{1, 3, 2},
{2, 4, 3},
{0, 2, -2}
};
Solution s = new Solution();
int[] modifiedArray = s.getModifiedArray(updates, length);
for(int num : modifiedArray)
System.out.print(num+" ");
}
}