LeetCode 1146スナップアレイ

ここでのオリジナルタイトルリンク: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   * /

 

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/12041830.html