一、思路
这题是差分的经典模板。如果我们用暴力的方法每次操作都直接计算,这样的时间复杂度太高。所以我们就可以通过构造差分数组,b[i] = a[i] - a[i - 1],然后再在差分数组进行操作,用b[l]+c, b[r + 1]-c,这样就将序列中[l, r]之间的每个数都加上c了,然后最后a[i] = a[i - 1] + b[i];来还原数组
二、代码模板
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] a = new int[n + 1]; //因为题目的区间下标是从1开始
int[] b = new int[n + 2]; //比a要多一个元素,为了防止之后b[r+1]越界
for(int i = 1; i <= n; i++) {
a[i] = in.nextInt();
b[i] = a[i] - a[i - 1]; //构造差分数组
}
while(m --> 0) {
int l = in.nextInt();
int r = in.nextInt();
int c = in.nextInt();
b[l] += c; //将序列中[l, r]之间的每个数都加上c
b[r + 1] -= c;
}
for(int i = 1; i <= n; i++) {
a[i] = a[i - 1] + b[i]; //利用差分数组还原数组
System.out.print(a[i] + " ");
}
System.out.println();
}
}
三、复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)