スナップショットアレイ

次のインタフェースをサポートしてい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(00 );
9          }
 10      }
11  
12      公共の ボイド 集合int型のインデックス、INT ヴァル){
 13          A [インデックス] .put(snap_id、ヴァル)。
14      }
 15  
16      公共 int型スナップ(){
 17          リターン ++ snap_id 18      }
 19  
20      公共 int型 のgetint型のインデックス、int型snap_id){
 21          リターンA [インデックス] .floorEntry(snap_id)以降.getvalue();
22      }
 23 }

 

おすすめ

転載: www.cnblogs.com/beiyeqingteng/p/11541223.html