1. 程式人生 > >LeetCode 370. Range Addition (範圍加法)$

LeetCode 370. Range Addition (範圍加法)$

作用 加法 first pan http nts end span xpl

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

operations were executed.

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 (範圍加法)$