[leetcode] 381. Insert Delete GetRandom O(1) - Duplicates allowed 解题报告

来源:互联网 发布:小公司记账软件 编辑:程序博客网 时间:2024/05/18 09:10

题目链接: https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/

Design a data structure that supports all following operations in average O(1) time.

Note: Duplicate elements are allowed.

  1. insert(val): Inserts an item val to the collection.
  2. remove(val): Removes an item val from the collection if present.
  3. getRandom: Returns a random element from current collection of elements. The probability of each element being returned is linearly related to the number of same value the collection contains.

Example:

// Init an empty collection.RandomizedCollection collection = new RandomizedCollection();// Inserts 1 to the collection. Returns true as the collection did not contain 1.collection.insert(1);// Inserts another 1 to the collection. Returns false as the collection contained 1. Collection now contains [1,1].collection.insert(1);// Inserts 2 to the collection, returns true. Collection now contains [1,1,2].collection.insert(2);// getRandom should return 1 with the probability 2/3, and returns 2 with the probability 1/3.collection.getRandom();// Removes 1 from the collection, returns true. Collection now contains [1,2].collection.remove(1);// getRandom should return 1 and 2 both equally likely.collection.getRandom();

思路: 和上题一样, 这次要用hash表保存一个值的多个位置, 可以用key-数组这样的形式来保存.

代码如下:

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) {        hash[val].push_back(vec.size());        vec.push_back(val);        return hash[val].size()==1;    }        /** Removes a value from the collection. Returns true if the collection contained the specified element. */    bool remove(int val) {        if(hash.count(val)==0) return false;        int pos = hash[val].back();        hash[val].pop_back();        if(hash[val].size()==0) hash.erase(val);        if(pos != vec.size()-1)        {            int tem = vec.back();            vec[pos] = tem;            hash[tem].pop_back();            hash[tem].push_back(pos);        }        vec.pop_back();        return true;    }        /** Get a random element from the collection. */    int getRandom() {        return vec[rand()%vec.size()];    }private:    unordered_map<int, vector<int>> hash;    vector<int> vec;};/** * 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(); */


0 0
原创粉丝点击