Insert Delete GetRandom O(1) - Duplicates allowed
来源:互联网 发布:mac 磁盘工具找回照片 编辑:程序博客网 时间:2024/05/16 00:59
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();
class RandomizedCollection {private: unordered_map<int,unordered_set<int>>dict; 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) { dict[val].insert(nums.size()); nums.push_back(val); return dict[val].size()==1; } /** Removes a value from the collection. Returns true if the collection contained the specified element. */ bool remove(int val) { if(dict.find(val)==dict.end()) return false; auto it=dict[val].begin(); swap(nums[*it],nums.back()); dict[nums[*it]].erase(nums.size()-1); dict[nums[*it]].insert(*it); nums.pop_back(); dict[val].erase(it); if(dict[val].empty()) dict.erase(val); return true; } /** Get a random element from the collection. */ int getRandom() { return nums[rand()%nums.size()]; }};/** * 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
- Insert Delete GetRandom O(1) - Duplicates allowed
- Insert Delete GetRandom O(1) - Duplicates allowed
- Insert Delete GetRandom O(1) - Duplicates allowed
- LeetCode—381. Insert Delete GetRandom O(1) - Duplicates allowed
- 【Leetcode】Insert Delete GetRandom O(1) - Duplicates allowed
- leetcode之Insert Delete GetRandom O(1) - Duplicates allowed
- [leetcode] 381. Insert Delete GetRandom O(1) - Duplicates allowed
- 151.Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- <leetcode>381. Insert Delete GetRandom O(1) - Duplicates allowed
- LeetCode Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- LeetCode 381. Insert Delete GetRandom O(1) - Duplicates allowed
- Insert Delete GetRandom O(1) - Duplicates allowed in JAVA
- LeetCode 381---Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- AppWidget实现自定义view
- OpenSuse安装MariaDB
- 几种计算机硬件接口
- monkey 命令
- Hibernate使用二级缓存时,createSQLQuery需要注意的问题
- Insert Delete GetRandom O(1) - Duplicates allowed
- UPDATE语句
- 利用jquery控制全选全不选按钮
- ViewController无法自动销毁
- toj 4611 Repairing a Road
- Android 事件分发一
- 【zzuli-oj】-985的方格难题(DP)
- SetTimer 几种用法(定时器)
- js 的 val() 和 text() 和 html()的区别与共性