[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.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表保存一个值的多个位置, 可以用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
- [leetcode] 381. 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
- [leetcode] 381. 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
- 【Leetcode】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
- Insert Delete GetRandom O(1) - Duplicates allowed
- Insert Delete GetRandom O(1) - Duplicates allowed
- 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
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- 381. Insert Delete GetRandom O(1) - Duplicates allowed
- rest
- 简单图+Havel_Hakimi定理
- Java_递归—Recursion
- 【枚举】POJ 3279
- POJ3111 最大化平均值
- [leetcode] 381. Insert Delete GetRandom O(1) - Duplicates allowed 解题报告
- C++实现动态顺序表(类和对象)
- Java虚拟机学习 - 体系结构 内存模型
- Android进阶系列4—从LayoutInflater到setContentView的LayoutInflater
- 进入相册选取图片和拍照方法 和解决在横屏状态下的调试
- ds18b20使用
- CopyOnWriteArrayList与java内存模型
- ZZULIOJ-【不是匹配】
- Java虚拟机学习 - 对象访问