Array
Prefix Sum
Description
You are given an integer length
and an array updates
where updates[i] = [startIdxi , endIdxi , inci ]
.
You have an array arr
of length length
with all zeros, and you have some operation to apply on arr
. In the ith
operation, you should increment all the elements arr[startIdxi ], arr[startIdxi + 1], ..., arr[endIdxi ]
by inci
.
Return arr
after applying all the updates
.
Example 1:
Input: length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]]
Output: [-2,0,3,5,3]
Example 2:
Input: length = 10, updates = [[2,4,6],[5,6,8],[1,9,-4]]
Output: [0,-4,2,2,2,4,4,-4,-4,-4]
Constraints:
1 <= length <= 105
0 <= updates.length <= 104
0 <= startIdxi <= endIdxi < length
-1000 <= inci <= 1000
Solutions
Solution 1: Difference Array
This is a template problem for difference arrays.
We define $d$ as the difference array. To add $c$ to each number in the interval $[l,..r]$, we set $d[l] += c$ and $d[r+1] -= c$. Finally, we compute the prefix sum of the difference array to obtain the original array.
The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array.
Python3 Java C++ Go TypeScript JavaScript
class Solution :
def getModifiedArray ( self , length : int , updates : List [ List [ int ]]) -> List [ int ]:
d = [ 0 ] * length
for l , r , c in updates :
d [ l ] += c
if r + 1 < length :
d [ r + 1 ] -= c
return list ( accumulate ( d ))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Solution {
public int [] getModifiedArray ( int length , int [][] updates ) {
int [] d = new int [ length ] ;
for ( var e : updates ) {
int l = e [ 0 ] , r = e [ 1 ] , c = e [ 2 ] ;
d [ l ] += c ;
if ( r + 1 < length ) {
d [ r + 1 ] -= c ;
}
}
for ( int i = 1 ; i < length ; ++ i ) {
d [ i ] += d [ i - 1 ] ;
}
return d ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 class Solution {
public :
vector < int > getModifiedArray ( int length , vector < vector < int >>& updates ) {
vector < int > d ( length );
for ( const auto & e : updates ) {
int l = e [ 0 ], r = e [ 1 ], c = e [ 2 ];
d [ l ] += c ;
if ( r + 1 < length ) {
d [ r + 1 ] -= c ;
}
}
for ( int i = 1 ; i < length ; ++ i ) {
d [ i ] += d [ i - 1 ];
}
return d ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14 func getModifiedArray ( length int , updates [][] int ) [] int {
d := make ([] int , length )
for _ , e := range updates {
l , r , c := e [ 0 ], e [ 1 ], e [ 2 ]
d [ l ] += c
if r + 1 < length {
d [ r + 1 ] -= c
}
}
for i := 1 ; i < length ; i ++ {
d [ i ] += d [ i - 1 ]
}
return d
}
1
2
3
4
5
6
7
8
9
10
11
12
13 function getModifiedArray ( length : number , updates : number [][]) : number [] {
const d : number [] = Array ( length ). fill ( 0 );
for ( const [ l , r , c ] of updates ) {
d [ l ] += c ;
if ( r + 1 < length ) {
d [ r + 1 ] -= c ;
}
}
for ( let i = 1 ; i < length ; ++ i ) {
d [ i ] += d [ i - 1 ];
}
return d ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 /**
* @param {number} length
* @param {number[][]} updates
* @return {number[]}
*/
var