[Leetcode週間のレース148]アレイ1146のスナップショット

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);
 */

おすすめ

転載: www.cnblogs.com/slowbirdoflsh/p/11314537.html