Leetcode1146. 快照数组

Every day a Leetcode

题目来源:1146. 快照数组

解法1:哈希 + 二分查找

每次调用 snap(),就复制一份数组的话,内存会爆。

为了节省内存,我们只存储修改的记录。调用 set(index,val) 时,不去修改数组,而是往 index 的历史修改记录末尾添加一条数据:此时的快照编号 cur_snap_id 和 val。

显然,历史修改记录中的快照编号是有序的。那我们在 get(int index, int snap_id) 时,就可以按 snap_id 做二分查找,找到编号小于等于 snap_id 的最新的修改记录,其中的 val 就是答案。

代码:

/*
 * @lc app=leetcode.cn id=1146 lang=cpp
 *
 * [1146] 快照数组
 */

// @lc code=start
class SnapshotArray
{
private:
    // 当前 snap_id
    int cur_snap_id = 0;
    // 每个 index 的历史修改记录
    unordered_map<int, vector<pair<int, int>>> history;

public:
    SnapshotArray(int length)
    {
    }

    void set(int index, int val)
    {
        auto p = pair<int, int>(cur_snap_id, val);
        history[index].push_back(p);
    }

    int snap()
    {
        return cur_snap_id++;
    }

    int get(int index, int snap_id)
    {
        auto &h = history[index];
        // 找快照编号 <= snap_id 的最后一次修改记录
        // 等价于找快照编号 >= snap_id+1 的第一个修改记录,它的上一个就是答案
        pair<int, int> p = {snap_id + 1, -1};
        int j = lower_bound(h.begin(), h.end(), p) - h.begin() - 1;
        return j >= 0 ? h[j].second : 0;
    }
};

/**
 * 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);
 */
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:初始化、set、snap 均为 O(1),get 为 O(log⁡q),其中 q 为 set 的调用次数。

空间复杂度:O(q),其中 q 为 set 的调用次数。

相关推荐

  1. leetcode1146--快照数组

    2024-04-29 20:54:03       11 阅读
  2. LeetCode 每日一题 ---- 【1146.快照数组

    2024-04-29 20:54:03       15 阅读
  3. LeetCode 1146. 快照数组【哈希表+二分查找】中等

    2024-04-29 20:54:03       11 阅读
  4. 力扣1146 快照数组

    2024-04-29 20:54:03       15 阅读
  5. 力扣1146.快照数组

    2024-04-29 20:54:03       9 阅读
  6. LeetCode //C - 1146. Snapshot Array

    2024-04-29 20:54:03       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-29 20:54:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-29 20:54:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-29 20:54:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-29 20:54:03       18 阅读

热门阅读

  1. 第30篇 RPC概述

    2024-04-29 20:54:03       12 阅读
  2. 题解:CF1946D(Birthday Gift)

    2024-04-29 20:54:03       10 阅读
  3. python第三方库

    2024-04-29 20:54:03       12 阅读
  4. CF1709B - Also Try Minecraft 题解

    2024-04-29 20:54:03       14 阅读
  5. jquery html(““)造成内存上涨

    2024-04-29 20:54:03       10 阅读
  6. SQL注入问题

    2024-04-29 20:54:03       8 阅读
  7. 香港CN2服务器如何应对DDoS攻击?

    2024-04-29 20:54:03       11 阅读
  8. 前端科举八股文-CSS篇

    2024-04-29 20:54:03       13 阅读
  9. 【无标题】

    2024-04-29 20:54:03       10 阅读