O(1) 时间插入、删除和获取随机元素

今天做到了这一题O(1) 时间插入、删除和获取随机元素,其利用了哈希的O(1)查找,和数组O(1)的随机访问特点来实现题目所要求的数据结构。

并且,做这道题目,纠正了我一个很大的误区,数组的删除,只有在要求顺序不变的情况下,其最坏时间复杂度才是O(N),否则可以通过交换当前数和数组尾部的数字,然后pop_back(),来实现O(1)时间复杂度的删除。

/*利用哈希的O(1)查找和数组的随机访问*/
class RandomizedSet {
private:
    map<int,int>mp;
    vector<int>nums;

    //O(1)时间复杂度删除一个数字
    void deleteNum(int n){
        int index=mp[n];
        nums[index]=nums[nums.size()-1];
        mp[nums[index]]=index;
        //删除
        mp.erase(n);
        nums.pop_back();
    }

public:
    /** Initialize your data structure here. */
    RandomizedSet() {
        srand((unsigned)time(NULL));
    }
    
    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    bool insert(int val) {
        if(mp.find(val)==mp.end()){
            mp[val]=nums.size();
            nums.emplace_back(val);
            return true;
        }
        return false;
    }
    
    /** Removes a value from the set. Returns true if the set contained the specified element. */
    bool remove(int val) {
        if(mp.find(val)!=mp.end()){
            deleteNum(val);
            return true;
            }
        return false;
    }
    
    /** Get a random element from the set. */
    int getRandom() {
        return nums[rand()%nums.size()];
    }
};

/**
 * 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();
 */
上一篇:测试用例日志模块编写:


下一篇:noip模拟43(待补)