LeetCode 370. Range Addition (範圍加法)$
Assume you have an array of length n initialized with all 0‘s and are given k update operations.
Each operation is represented as a triplet: [startIndex, endIndex, inc] which increments each element of subarray A[startIndex ... endIndex] (startIndex and endIndex inclusive) with inc.
Return the modified array after all k
Example:
Given: length = 5, updates = [ [1, 3, 2], [2, 4, 3], [0, 2, -2] ] Output: [-2, 0, 3, 5, 3]
Explanation:
Initial state: [ 0, 0, 0, 0, 0 ] After applying operation [1, 3, 2]: [ 0, 2, 2, 2, 0 ] After applying operation [2, 4, 3]: [ 0, 2, 5, 5, 3 ] After applying operation [0, 2, -2]: [-2, 0, 3, 5, 3 ]
題目標簽:Array
題目給了我們一個2d updates, 和一個 length, 讓我們返回一個 size = length 的array, 是經過 updates 的範圍加法改動過的。
因為題目hint 說了要時間復雜度O(k+n)。所以我們不能遇到每一個update,都去array 裏改動一次。
先遍歷updates, 對於每一個update,我們只需要 標記 範圍開始的 的那個number 和 範圍結束的那個 number 的後一個。這裏相當於,給每一個update 都規定了一個範圍,開始是加,結尾後一個數字是減。
再遍歷res array,設一個sum = 0, 對於每一個number, 把number 的值加入sum裏, 再把number = sum。這裏的意思就是遇到任何一個範圍開始的時候,進行累加,因為我們只更改了開頭和結尾,所以中間都是沒更改過的值,或者是其他的範圍開頭結尾。累加的作用就是把中間沒改過的number 都補上該有的值。
舉例來看一下:
updates = [1,3,2] 和 [2,4,3],length = 5
0 0 0 0 0
先遍歷updates, 把開頭和結尾標記
0 2 0 0 -2 index 1 = 2;index 3+1 = -2;
0 2 3 0 -2 index 2 = 3;index 4+1 超出了範圍,就不用處理。
遍歷res array,進行累加 sum += res[i], res[i] = sum
0 2 3 0 -2 sum = 0+0
0 2 3 0 -2 sum = 0+2
0 2 5 0 -2 sum = 2+3
0 2 5 5 -2 sum = 5+0
0 2 5 5 3 sum = 5-2
可以看到,從第一個範圍開頭開始,sum 進行累加,並更新number,如果遇到另一個範圍,繼續累加,如果遇到任何一個範圍結束,把那一個範圍累加的值減去,這個範圍的加法就結束了,繼續其他的。
Java Solution:
Runtime beats 77.60%
完成日期:09/16/2017
關鍵詞:Array
關鍵點:只需要標記範圍開始,和結束的位置,之後進行累加
1 class Solution 2 { 3 public int[] getModifiedArray(int length, int[][] updates) 4 { 5 int [] res = new int[length]; 6 7 // iterate each operation 8 for(int[] update: updates) 9 { 10 int start = update[0]; 11 int end = update[1]; 12 int val = update[2]; 13 14 // mark first element 15 res[start] += val; 16 // mark last element (end + 1) 17 if(end + 1 < length) 18 res[end + 1] -= val; 19 } 20 21 int sum = 0; 22 for(int i=0; i<length; i++) 23 { 24 sum += res[i]; 25 res[i] = sum; 26 } 27 28 return res; 29 } 30 }
參考資料:
https://discuss.leetcode.com/topic/49691/java-o-k-n-time-complexity-solution
LeetCode 題目列表 - LeetCode Questions List
LeetCode 370. Range Addition (範圍加法)$