ディレクトリ
1146スナップショット配列arrayのスナップショット
説明
実装は、次のインターフェイススナップショット・アレイ「をサポート - SnapshotArrayを:
- SnapshotArray(INT長) -に等しい指定された長さに初期化
类数组
データ構造。最初に、各要素はに等しい0。 - 空のセット(インデックス、valが) -インデックス指定されます
index
セットの要素をval
。 - INTスナップ() -配列のスナップショットを取得し、スナップショットの数を返す
snap_id
(スナップショット番号がコール(スナップの総数である)マイナス1)。 int型のget(インデックス、snap_id) -指定さに応じて
snap_id
選択のスナップショット、スナップショットは、指定されたインデックスの戻りindex
値を。例
入力:[ "SnapshotArray"、 "SET"、 "SNAP"、 "SET"、 "GET"]
[。[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
snapshotArr.set(0,6);
snapshotArr.get(0,0); //配列にスナップショットsnap_id = 0の値を取得[0]、及び5を返します。
考え
これだけの場所に保存されているスペースを開くために、それぞれの場所变化
ため、各場所の変更の数は同じではありません
あなたが値をしたいとき、彼らは探し少ない最新snap_id入力变化
- スナップショットの配列を構築するためにリスト+地図データ構造を使用します
各位置のための店での一覧の変更
変更後の値:スナップショット数値:キーでTreeMapの単一ストレージの変更
- その構造の例
コードの実装
ArrayListの+のTreeMap
class SnapshotArray {
// List 存储每个位置的变动情况
// TreeMap 存储单次变动情况 key:快照编号 value:变动后的值
// [index,[(snapId, val), (snapId, val)...]]
List<TreeMap<Integer, Integer>> list = new ArrayList<>();
// 当前快照编号
int snapId = 0;
// 初始化
public SnapshotArray(int length) {
snapId = 0;
// 开始每个位置全为0
for (int i = 0; i < length; i++) {
TreeMap<Integer, Integer> t = new TreeMap<>();
t.put(snapId, 0);
list.add(t);
}
}
public void set(int index, int val) {
// 重复就覆盖
list.get(index).put(snapId, val);
}
public int snap() {
int res = snapId;
snapId++;
return res;
}
/**
* 难点
* 需要在TreeMap的key值中寻找小于快照编号snap_id的数据
*
* 这里取巧使用了自带的方法
* floorEntry(key) 找到key值接近snap_id的实体Entry
**/
public int get(int index, int snap_id) {
TreeMap<Integer, Integer> t = list.get(index);
return t.floorEntry(snap_id).getValue();
}
}
/**
* Your SnapshotArray object will be instantiated and called as such:
* SnapshotArray obj = new SnapshotArray(length);
* obj.set(index,val);
* int param_2 = obj.snap();
* int param_3 = obj.get(index,snap_id);
*/