码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 381.Insert Delete GetRandom

时间:2018-09-12 18:10:36      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:ack   led   turn   let   The   rand   需要   ras   col   

这道题中要求使用O(1)的方法来删除和插入元素的,那么首先需要寻找到对应的元素,这个可以使用map的O(1)的查询时间的,然后是删除对应的元素的,那么可以根据 堆排序中类似的做法把最后面的元素插入到前面来并且置换掉对应的值的。

class RandomizedCollection {
public:
    /** Initialize your data structure here. */
    RandomizedCollection() {
        
    }
    
    /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
    bool insert(int val) {
        m[val].insert(num.size());
        num.push_back(val);
        return m[val].size()==1;
    }
    
    /** Removes a value from the collection. Returns true if the collection contained the specified element. */
    bool remove(int val) {
        if(m[val].empty()) return false;
        int pos=*m[val].begin();
        m[val].erase(pos);
        if(pos!=num.size()-1){
            int temp=num.back();
            num[pos]=temp;
            m[temp].erase(num.size()-1);
            m[temp].insert(pos);
        }
        num.pop_back();
        return true;
    }
    
    /** Get a random element from the collection. */
    int getRandom() {
        return num[rand()%num.size()];
    }
private:
    vector<int> num;
    map<int, set<int>> m;
};

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

 

leetcode 381.Insert Delete GetRandom

标签:ack   led   turn   let   The   rand   需要   ras   col   

原文地址:https://www.cnblogs.com/newnoobbird/p/9636116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!