假设你有一个长度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k 个更新的操作。
其中,每个操作会被表示为一个三元组:[startIndex, endIndex, inc],你需要将子数组 A[startIndex …
endIndex](包括 startIndex 和 endIndex)增加 inc。请你返回 k 次操作后的数组。
示例:
输入: length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]] 输出: [-2,0,3,5,3]
解释:初始状态: [0,0,0,0,0] 进行了操作 [1,3,2] 后的状态: [0,2,2,2,0] 进行了操作 [2,4,3]
后的状态: [0,2,5,5,3] 进行了操作 [0,2,-2] 后的状态: [-2,0,3,5,3] 思路:如果每一次操作都要处理整个区间上的数的话,太麻烦了,容易超时。
所以不妨先仅用区间的起点和终点来记录对整个区间上的操作。
对于操作[start, end, inc], 把nums[start] += inc, nums[end +1] -= inc。
比如对于[0, 0, 0, 0, 0]进行操作[1,3,2],用新的数组进行记录:[0, 2, 0, 0,-2, 0 ]
想要得到处理的结果,则从前往后得到前缀和数组,即[0, 2, 2, 2, 0, 0],弃最后一位不要,因为它只是用来保存操作
class findArray
{
public int[] getArray(int length,int[][] updates)
{
int [] ans = new int[length];
int startIndex,endIndex,val;
for(int[] update:updates)
{
startIndex=update[0];
endIndex=update[1];
val=update[2];
ans[startIndex]+=val;
if(endIndex<length-1)
{
ans[endIndex+1]-=val;
}
}
for (int i = 1; i < length; i++) {
ans[i] += ans[i - 1];
}
return ans;
}
}
public class aaaa {
public static void main(String[] args) {
// TODO 自动生成的方法存根
findArray array = new findArray();
int length=5;
int [][] update= {{1,3,2},{2,4,3},{0,2,-2}};
int [] a=new int[length];
a=array.getArray(length, update);
for(int i=0;i<length;i++)
{
System.out.print(a[i]+" ");
}
}
}