美文网首页
Insert Delete GetRandom O(1)

Insert Delete GetRandom O(1)

作者: 我叫胆小我喜欢小心 | 来源:发表于2017-05-15 10:46 被阅读11次

题目来源
设计一个结构,插入,删除以及随机取都是平均O(1)时间。
插入删除是O(1),肯定得用哈希,然后随机取O(1)的话得是数组。所以得用一个哈希加一个数组,哈希存的是值和位置的映射。
代码如下:

class RandomizedSet {
public:
    /** Initialize your data structure here. */
    RandomizedSet() {
        
    }
    
    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    bool insert(int val) {
        if (maps.count(val) != 0)
            return false;
        values.emplace_back(val);
        maps[val] = values.size() - 1;
        return true;
    }
    
    /** Removes a value from the set. Returns true if the set contained the specified element. */
    bool remove(int val) {
        if (maps.count(val) != 0) {
            maps[values[values.size() - 1]] = maps[val];
            values[maps[val]] = values[values.size() - 1];
            values.pop_back();
            maps.erase(val);
            return true;
        }
        else
            return false;
    }
    
    /** Get a random element from the set. */
    int getRandom() {
        int r = rand() % maps.size();
        return values[r];
    }
private:
    unordered_map<int, int> maps;
    vector<int> values;
};

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * bool param_1 = obj.insert(val);
 * bool param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */

相关文章

网友评论

      本文标题:Insert Delete GetRandom O(1)

      本文链接:https://www.haomeiwen.com/subject/zfzcxxtx.html