370.範囲の追加



370 Range Addition



説明

長さの配列があると仮定します n すべてで初期化 0 とが与えられます 更新操作。

各操作はトリプレットとして表されます。 [startIndex、endIndex、inc] サブアレイの各要素をインクリメントします A [startIndex ... endIndex] (startIndexおよびendIndexを含む) 株式会社



結局、変更された配列を返します 操作が実行されました。

例:



与えられた:

長さ= 5、
更新= [
[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]

クレジット:
感謝します @ vinod23 この問題を追加し、すべてのテストケースを作成してくれました。

解決

ブルートフォース、O(mn)、S(1)、(TLE)

m:updates.length
n:長さ

class Solution { public int[] getModifiedArray(int length, int[][] updates) { if (length <1 || updates == null) { return new int[0] } int[] nums = new int[length] for (int[] update : updates) { for (int i = update[0] i <= update[1] ++i) { nums[i] += update[2] } } return nums } }

数学、O(m + n)、S(1)

素晴らしい質問です、実際、各更新[]について、対応する間隔のすべての値を実行する必要はありません。間隔の開始と終了、head + val、tail-valをマークするだけで済みます。このように、nums []をトラバースし、累積を記録し、nums [i]を合計するだけで済みます。

class Solution { public int[] getModifiedArray(int length, int[][] updates) { if (length <1 || updates == null) { return new int[0] } int[] nums = new int[length] for (int[] update : updates) { int start = update[0] int end = update[1] + 1 int val = update[2] nums[start] += val if (end < nums.length) { nums[end] -= val } } int sum = 0 for (int i = 0 i < nums.length ++i) { sum += nums[i] nums[i] = sum } return nums } }