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);
 */
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值