381. Insert Delete GetRandom O(1) - Duplicates allowed
来源:互联网 发布:桥接的网络不稳定 编辑:程序博客网 时间:2024/06/06 10:47
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()]; }};
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] 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
- 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
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- 【Leetcode】Insert Delete GetRandom O(1) - Duplicates allowed
- leetcode之Insert Delete GetRandom O(1) - Duplicates allowed
- 151.Insert Delete GetRandom O(1) - Duplicates allowed
- LeetCode Insert Delete GetRandom O(1) - Duplicates allowed
- Insert Delete GetRandom O(1) - Duplicates allowed in JAVA
- 基于react-native实现的博客园移动客户端,兼容android和ios
- 使用Spring的Quartz Scheduler进行任务定时调度
- SSH Secure File Transfer Client连接远程设备报“algorithm negotiation failed”错的解决方法
- Js~对数组的操作
- java中Math类的常用API
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- C++中getline函数用法解析
- node.JS开篇
- JavaScript对象及作用域bind
- GCD学习与回顾
- 1002. A+B for Polynomials (25)
- JS一个对象封装多个函数
- Hbase表设计
- cvCamShift函数