ここでのオリジナルタイトルリンク:https://leetcode.com/problems/snapshot-array/
トピック:
次のインタフェースをサポートしていSnapshotArrayを実装します。
SnapshotArray(int length)
与えられた長さの配列のようなデータ構造を初期化します。最初は、各要素は0に等しいです。void set(index, val)
所定のATセットの要素index
に等しくなりますval
。int snap()
配列のスナップショットを取得して返しますsnap_id
:私たちは呼ばれた回数の合計snap()
マイナス1
。int get(index, snap_id)
一定の値を返します。index
私たちは与えられたとのスナップショットを取った時点で、snap_id
例1:
入力:[ "SnapshotArray"、 "セット"、 "スナップ"、 "セット"、 "取得"] [[3]、[0,5]、[]、[0,6]、[0,0]] 出力[NULL、NULL、0、NULL、5] 説明: SnapshotArray snapshotArr =新しいSnapshotArray(3)。// 3と長さを設定 snapshotArr.set(0,5)。//セット配列[0] = 5 snapshotArr.snap()。// snap_id = 0を返す、スナップショットを作成します (0,6)をsnapshotArr.setを。 snapshotArr.get(0,0)。// snap_id = 0の配列[0]の値を取得し、5を返します
制約:
1 <= length <= 50000
- せいぜい
50000
呼び出しに行われるset
、snap
とget
。 0 <= index < length
0 <= snap_id <
(私たちは呼んで合計回数snap()
)0 <= val <= 10^9
ソリューション:
代わりに、メモリ空間の多くがかかっ各スナップショットのメイクコピー、一連のメソッドを呼び出すときに、我々は、細胞の状態を記録できます。
TreeMapの配列を持って、それぞれのTreeMapは、細胞の状態を維持します。
セットを呼び出すとき、このセルの新しい値で、現在のスナップショットIDをマーク。
GETを呼び出すときに、指定したスナップショットIDを持つ階入り口を取得しよう。
時間計算:SnapshotArray、O(長さ)。セット、O(LOGN)。スナップ、O(1)。取得するには、O(LOGN)。N ARRの総エントリ数、previoius設定呼の数です。
スペース:O(n)を。
ACのJava:
1 クラスSnapshotArray { 2 のTreeMap <整数、整数> [] ARR。 3 int型snapId。 4 5 公共 SnapshotArray(int型の長さ){ 6 ARR = 新規のTreeMap [長さ]。 7 のための(INT I 0 =; I <長さ、I ++ ){ 8 ARRは、[I] = 新規のTreeMap <整数、整数> (); 9つの ARR [I] .put(0、0 ); 10 } 11 12 snapId = 0 。 13 } 14 15 公共の ボイド集合(整数インデックス、INT ヴァル){ 16 ARR [インデックス] .put(snapId、ヴァル)。 17 } 18 19 公共 int型スナップ(){ 20 リターン snapId ++ 。 21 } 22 23 公共 int型のget(int型のインデックス、INT snap_id){ 24 リターンARR [インデックス] .floorEntry(snap_id)以降.getvalue(); 25 } 26 } 27 28 / ** 29 *あなたのSnapshotArrayオブジェクトがインスタンス化され、などと呼ばれます: 30 * SnapshotArray OBJ =新しいSnapshotArray(長さ); 31 * obj.set(インデックス、ヴァル)。 32 * INT PARAM_2 = obj.snap()。 33 * INT param_3 = obj.get(インデックス、snap_id)。 34 * /