370. Range Addition

题目链接:https://leetcode.com/problems...

这道题暴力法是可以的,每次把所有在start到end之间的值都更新一遍,不过题目要求要O(k+n),所以其实每次更新只能用constant的时间。有点像prefix sum的意思,每次只更新第一个值,最后把值加起来,最后怎么确定结束的地方呢?没法知道在哪结束,但是可能让结束之后的地方恢复原来的值,所以要在[end+1]的方法更新成负值,这样结束之后就抵消了。如果结束的地方就在array末尾,那就不更新。

public class Solution {
    public int[] getModifiedArray(int length, int[][] updates) {
        int[] result = new int[length];
        // only update start and end + 1
        for(int[] update : updates) {
            result[update[0]] += update[2];
            if(update[1] < length - 1) result[update[1] + 1] -= update[2];
        }
        // calculate prefix sum
        int prefix = 0;
        for(int i = 0; i < result.length; i++) {
            result[i] += prefix;
            prefix = result[i];
        }
        return result;
    }
}

lulouch13
13 声望6 粉丝