leetcode1146--快照数组

1. 题意

对一个数组进行多次修改,然后照一个快照。

再对数组进行询问第k次快照时的index处的值。

2. 题解

  • 哈希表 + 二分
    对于每个位置,我们只需要顺序记录这个位置更改的快照和时间和值即可;
    再通过二分查找来获取它的值。

  • 我的代码

class SnapshotArray {
private:
// index snap_cnt  val 
unordered_map<int, vector< pair<int,int>> > mem;

int snap_cnt;
public:
    SnapshotArray(int length):snap_cnt(0){

    }
    
    void set(int index, int val) {
        if ( mem.find( index ) == mem.end() ) {
            vector< pair<int,int>> tmp;
            mem[ index ] = tmp;   
        }

        if ( mem[ index ].empty()) {
            mem[ index ].push_back({snap_cnt, val});
        }
        else {
            int sz = mem[ index ].size();
            if ( mem[index][sz - 1].first != snap_cnt) {
                mem[ index ].push_back({snap_cnt, val});
            }
            else {
                mem[index][sz - 1].second = val;
            }
        }
    }
    
    int snap() {
        snap_cnt++;
        return snap_cnt - 1;
    }
    
    int get(int index, int snap_id) {
        if ( mem.find( index ) == mem.end() )
            return 0;   

        pair<int,int> p(snap_id, 0);

        auto low = lower_bound( mem[index].begin(), mem[index].end(), p, 
        [](const pair<int,int> &a, const pair<int,int> &b){
            return a.first < b.first;
        } );
        
        int sz = mem[ index ].size();
        if ( low == mem[index].end())
            return mem[ index ][ sz - 1 ].second;


        if ( low == mem[ index ].begin() && snap_id < low->first)
            return 0;

        if ( low->first == snap_id)
            return low->second;
        else {
            return (low - 1)->second;
        }
        
        return 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);
 */

  • 使用upper_bound
class SnapshotArray {
private:
    // index snap_cnt  val
    unordered_map<int, vector<pair<int, int>>> mem;

    int snap_cnt;

public:
    SnapshotArray(int length) : snap_cnt(0) {}

    void set(int index, int val) {
        // if ( mem.find( index ) == mem.end() ) {
        //     vector< pair<int,int>> tmp;
        //     mem[ index ] = tmp;
        // }

        // if ( mem[ index ].empty()) {
        //     mem[ index ].push_back({snap_cnt, val});
        // }
        // else {
        //     int sz = mem[ index ].size();
        //     if ( mem[index][sz - 1].first != snap_cnt) {
        //         mem[ index ].push_back({snap_cnt, val});
        //     }
        //     else {
        //         mem[index][sz - 1].second = val;
        //     }
        // }
        mem[index].emplace_back(snap_cnt, val);
    }

    int snap() {
        snap_cnt++;
        return snap_cnt - 1;
    }

    int get(int index, int snap_id) {
        pair<int, int> p(snap_id, 0);

        auto low =
            upper_bound(mem[index].begin(), mem[index].end(), p,
                        [](const pair<int, int>& a, const pair<int, int>& b) {
                            return a.first < b.first;
                        });

        return low == mem[index].begin() ? 0 : (low - 1)->second;
    }
};

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

相关推荐

  1. leetcode1146--快照数组

    2024-04-29 21:40:03       14 阅读
  2. LeetCode 每日一题 ---- 【1146.快照数组

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

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

    2024-04-29 21:40:03       16 阅读
  5. 力扣1146.快照数组

    2024-04-29 21:40:03       12 阅读
  6. LeetCode //C - 1146. Snapshot Array

    2024-04-29 21:40:03       17 阅读

最近更新

  1. TCP协议是安全的吗?

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

    2024-04-29 21:40:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

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

    2024-04-29 21:40:03       20 阅读

热门阅读

  1. 使用python写一个识别人脸

    2024-04-29 21:40:03       11 阅读
  2. C#面:委托是什么?事件是不是一种委托?

    2024-04-29 21:40:03       16 阅读
  3. 2d激光slam的改进方案探索

    2024-04-29 21:40:03       12 阅读
  4. C/C++中的整数乘法运算与汇编指令MUL和IMUL

    2024-04-29 21:40:03       13 阅读
  5. 内核镜像

    2024-04-29 21:40:03       13 阅读
  6. 常用的网站和软件

    2024-04-29 21:40:03       14 阅读
  7. 发现问题并进行管理——bug和调试器

    2024-04-29 21:40:03       15 阅读
  8. vue源码中如何实现数据监听?

    2024-04-29 21:40:03       15 阅读
  9. 反射会打破单例模式吗

    2024-04-29 21:40:03       15 阅读
  10. C语言十进制转十六进制

    2024-04-29 21:40:03       12 阅读
  11. 使用Docker搭建Nacos集群

    2024-04-29 21:40:03       12 阅读
  12. 这款永久免费云服务器实在是太好用了

    2024-04-29 21:40:03       16 阅读
  13. Meta大佬亲授LLaMA 3的奥秘

    2024-04-29 21:40:03       12 阅读