次のインタフェースをサポートしていSnapshotArrayを実装します。
SnapshotArray(int length)
与えられた長さの配列のようなデータ構造を初期化します。最初は、各要素は0に等しいです。void set(index, val)
所与の要素を設定すること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、0、NULL、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)。//配列の値を取得[0] = 0 snap_idと、5返す
分析を:https://leetcode.com/problems/snapshot-array/
アイデアは、配列全体を大きくすることができるされ、私たちは時代のスナップトンがかかる場合があります。代わりに、レコードの配列全体の歴史は、我々は、各セルの履歴を記録します。そして、これは、我々はすべての情報を記録するために必要な最小限のスペースです。各A [i]のために、私たちはその歴史を記録します。snap_idとその値を持ちます。我々は歴史の中で値を取得したい場合は、単にバイナリサーチ時点。
複雑時間
SnapshotArray(INT長)O(N)時間であります
セット(int型のインデックス、int型valが)O(logSnap)であります
スナップ()O(1)
(int型のインデックス、int型のsnap_id)を取得O(logSnap)であります
1 クラスSnapshotArray { 2 のTreeMap <整数、整数> []。 3 INT snap_id = 0 。 4 公共 SnapshotArray(int型の長さ){ 5 A = 新たTreeMapの[長さ]。 図6は、 のために(int型 i = 0 ; iは長さ<; iは++ ){ 7 A [I] = 新規のTreeMap <整数、整数> (); 8 A [i]が.put(0、0 ); 9 } 10 } 11 12 公共の ボイド 集合(int型のインデックス、INT ヴァル){ 13 A [インデックス] .put(snap_id、ヴァル)。 14 } 15 16 公共 int型スナップ(){ 17 リターン ++ snap_id 。 18 } 19 20 公共 int型 のget(int型のインデックス、int型snap_id){ 21 リターンA [インデックス] .floorEntry(snap_id)以降.getvalue(); 22 } 23 }