国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

381. Insert Delete GetRandom O(1) - Duplicates allowed

2019-11-08 19:39:49
字體:
來源:轉載
供稿:網友

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

Note: Duplicate elements are allowed.

insert(val): Inserts an item val to the collection.remove(val): Removes an item val from the collection if PResent.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表,但記錄val在數組中的位置用set。

class RandomizedCollection {   map<int,set<int>> locs;//val to loc    vector<int> nums;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) {        nums.push_back(val);        locs[val].insert(nums.size()-1);        if(locs[val].size()==1)        return 1;        else return 0;    }        /** Removes a value from the collection. Returns true if the collection contained the specified element. */    bool remove(int val) {       if(locs.find(val)==locs.end()) return 0;       int idx=*locs[val].begin();       int last=nums[nums.size()-1];       nums[idx]=last;              locs[val].erase(idx);//這里必須先刪除一個才可以插入,如果last和val相等,先插入,會沒有效果。這里調試了好久才找到錯誤       locs[last].insert(idx);       locs[last].erase(nums.size()-1);       nums.pop_back();                   if(locs[val].size()==0) locs.erase(val);       return 1;          }        /** Get a random element from the collection. */    int getRandom() {      return nums[rand()%nums.size()];      }};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山阴县| 满洲里市| 荆门市| 白河县| 洛南县| 海伦市| 靖州| 武清区| 永嘉县| 化德县| 景谷| 宣武区| 南雄市| 蓝山县| 长春市| 中卫市| 惠水县| 大新县| 东平县| 平江县| 古交市| 泰和县| 高陵县| 秀山| 双城市| 南丰县| 青神县| 榕江县| 罗甸县| 连云港市| 云梦县| 吐鲁番市| 安西县| 齐河县| 南充市| 揭阳市| 株洲市| 远安县| 泸溪县| 永宁县| 彝良县|