LeetCode 1146. 快照数组***(double,need triple)

具体思路:

二分卡了很久,这里简单说一下这种情况,手写二分恶心的情况基本上都碰到了;

首先明确一下,vector<vector<pair<int,int>>>第一层是index,第二层是pair,first为快照id,second为具体元素;

由于这种方法的特殊性,会导致某一时刻的快照,如果后续没有新改变,则不会保存;

例如,快照索引:[3,5,6];

代表,0,1,2,为空,4和3的快照相同,因此二分的时候要格外注意;

对于寻找idx的情况,应该寻找两种:

  1. 如果为idx存在;
  2. 如果idx不存在,应该寻找最后一个小于idx的情况,此时表现为寻找第一个大于idx的元素;

针对于第二种情况,会分三种,第一种情况可以合并为第三种;

  1. 例如[2,3,4],idx=1,此时所有元素都大于idx,此时减1为-1,直接返回初始值0;
  2. 例如[2,4,5],idx=3,此时寻找到4,idx=2 ,减1就是答案;
  3. 例如[2,4,5],idx=6,此时寻找到最大值,但是判断idx大于该元素,直接返回;

具体代码:

class SnapshotArray {
public:
    SnapshotArray(int length) {
        time=0;
        snaps.resize(length);
    }
    
    void set(int index, int val) {
        change[index]=val;
    }
    
    int snap() {
        for(auto [a,b]:change){
            snaps[a].push_back({time,b});
        }
        change.clear();
        time++;
        return time-1;
    }
    
    int get(int index, int snap_id) {
        auto& vec=snaps[index];
        if(vec.size()==0)
            return 0;
        int l=0,r=vec.size()-1;
        while(l<r){
            int mid=l+(r-l)/2;
            if(vec[mid].first<=snap_id){
                l=mid+1;
            }else{
                r=mid;
            }
        }
        if(vec[l].first<=snap_id)
            return vec[l].second;
        else{
            if(l==0)
                return 0;
            else
                return vec[l-1].second;
        }
        return 0;
    }
private:
    unordered_map<int, int>change;
    vector<vector<pair<int,int>>>snaps;
    int time;
};

/*
0,1,2

1,2,3


*/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值