[leetcode]381. Insert Delete GetRandom O(1)
来源:互联网 发布:淘宝酒水保证金 编辑:程序博客网 时间:2024/05/20 04:31
题目链接:https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/description/
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();
There are two data member in the solution
- a vector nums
- an unordered_map m
The key of m is the val, the value of m is a vector contains indices where the val appears in nums.
Each element of nums is a pair, the first element of the pair is val itself, the second element of the pair is an index into m[val].
There is a relationship between nums and m:
m[nums[i].first][nums[i].second] == i;
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) { auto result = m.find(val) == m.end(); m[val].push_back(nums.size()); nums.push_back(pair<int, int>(val, m[val].size() - 1)); return result; } /** Removes a value from the collection. Returns true if the collection contained the specified element. */ bool remove(int val) { auto result = m.find(val) != m.end(); if(result) { auto last = nums.back(); m[last.first][last.second] = m[val].back(); nums[m[val].back()] = last; m[val].pop_back(); if(m[val].empty()) m.erase(val); nums.pop_back(); } return result; } /** Get a random element from the collection. */ int getRandom() { return nums[rand() % nums.size()].first; }private: vector<pair<int, int>> nums; unordered_map<int, vector<int>> m;};
阅读全文
0 0
- leetcode 381. Insert Delete GetRandom O(1)
- leetcode 381. Insert Delete GetRandom O(1)
- [Leetcode] 381. Insert Delete GetRandom O(1)
- [leetcode]381. Insert Delete GetRandom O(1)
- leetcode 381. Insert Delete GetRandom O(1)
- 【leetcode】Insert Delete GetRandom O(1)
- 【Leetcode】Insert Delete GetRandom O(1)
- LeetCode[380] Insert Delete GetRandom O(1)
- Leetcode 之 Insert Delete GetRandom O(1)
- LeetCode:381 Insert Delete GetRandom O(1)
- leetcode之 Insert Delete GetRandom O(1)
- [leetcode] 380. Insert Delete GetRandom O(1)
- leetcode 380.Insert Delete GetRandom O(1)
- LeetCode Insert Delete GetRandom O(1)
- [LeetCode]380. Insert Delete GetRandom O(1)
- LeetCode 380---Insert Delete GetRandom O(1)
- 【Leetcode】380. Insert Delete GetRandom O(1)
- LeetCode 380. Insert Delete GetRandom O(1)
- OpenTracing语义标准规范及实现
- opengl绘图
- 用JS实现人物走动动画效果
- Maven和Ant简介以及两者的区别
- Linux文件的硬连接与软连接
- [leetcode]381. Insert Delete GetRandom O(1)
- LOI队内题单qwq
- 重装win10系统
- 检查文件类型
- Spring Cloud Feign 使用方式
- bzoj3238后缀自动机-线性构造后缀树
- UVA
- 组合数奇偶性判定方式
- 链表基本操作