zoukankan      html  css  js  c++  java
  • [leetcode 周赛 148] 1146 快照数组

    1146 Snapshot Array 快照数组

    描述

    实现支持下列接口的「快照数组」- SnapshotArray:

    • SnapshotArray(int length) - 初始化一个与指定长度相等的 类数组 的数据结构。初始时,每个元素都等于 0

    • void set(index, val) - 会将指定索引 index 处的元素设置为 val

    • int snap() - 获取该数组的快照,并返回快照的编号 snap_id(快照号是调用 snap() 的总次数减去 1)。

    • int get(index, snap_id) - 根据指定的 snap_id 选择快照,并返回该快照指定索引 index 的值。

    • 示例

    输入:["SnapshotArray","set","snap","set","get"]
    [[3],[0,5],[],[0,6],[0,0]]
    输出:[null,null,0,null,5]
    解释:
    SnapshotArray snapshotArr = new SnapshotArray(3); // 初始化一个长度为 3 的快照数组
    snapshotArr.set(0,5); // 令 array[0] = 5
    snapshotArr.snap(); // 获取快照,返回 snap_id = 0
    snapshotArr.set(0,6);
    snapshotArr.get(0,0); // 获取 snap_id = 0 的快照中 array[0] 的值,返回 5

    思路

    给每个位置都开辟一块空间, 该空间只保存本位置的变化
    因为各个位置的变动次数是不一样的
    当要取值时, 就寻找小于等于输入snap_id的最新变化

    • 使用List+Map数据结构构建快照数组

    List 存储每个位置的变动情况
    TreeMap 存储单次变动情况 key:快照编号 value:变动后的值
    使用List+Map

    • 实例及其结构

    代码实现

    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);
     */
    
  • 相关阅读:
    绑定方法和非绑定方法
    property属性
    面向对象的三大特征之一:封装
    asp:GridView控件的使用
    javaWeb中struts开发——Logic标签
    javaWeb中struts开发——Bean标签
    大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现
    大话数据结构(十一)java程序——串
    大话数据结构(七)——单链表的整表创建与删除
    大话数据结构(十)java程序——队列
  • 原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11314537.html
Copyright © 2011-2022 走看看