美文网首页
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