LeetCode381. O(1) 時間插入、刪除和獲取隨機元素 - 允許重複
//381. O(1) 時間插入、刪除和獲取隨機元素 - 允許重複
/*
* 使用陣列來儲存所有元素
* 因為不需要考慮順序,所以插入的話,直接放在陣列後面就可以,常數時間
* 主要是刪除,刪除的時候,需要先查詢元素所在的位置,然後刪除
* 查詢的時候,可以通過雜湊map和set結合,記錄各種元素的位置
* 用這種方法可以使查詢的時間變為常數時間
* 查詢之後,就是刪除
* 刪除的話可以將當前元素和陣列的最後一個元素互換內容,然後刪除陣列的最後一個元素,時間也是常數
* 刪除之後,更新一下元素的位置即可
*/
class RandomizedCollection {
public:
unordered_map<int, unordered_set<int>> id;
vector<int>nums;
/** 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) {
id[val].emplace(nums.size());
nums.emplace_back(val);
return id[val].size() == 1;
}
/** Removes a value from the collection. Returns true if the collection contained the specified element. */
bool remove(int val) {
if (id[val].empty()) return false;
int vid = *(id[val].begin());
nums[vid] = nums.back();
id[val].erase(vid);
id[nums.back()].erase(nums.size() - 1);
if (vid != nums.size() - 1) id[nums.back()].emplace(vid);
nums.pop_back();
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();
*/
相關文章
- O(1) 時間插入、刪除和獲取隨機元素,允許元素重複隨機
- [M設計+雜湊表] lc380. 常數時間插入、刪除和獲取隨機元素(設計+雜湊表)隨機
- java獲取時間戳和隨機數Java時間戳隨機
- Java ArrayList 查詢、刪除指定元素;排序;遍歷;隨機獲取元素等常用操作Java排序隨機
- JavaScript陣列刪除重複元素JavaScript陣列
- JavaScript 刪除陣列重複元素JavaScript陣列
- Remove Duplicate Letters 刪除重複元素REM
- Java 獲取Word中的所有插入和刪除修訂Java
- 13. O(1)時間刪除連結串列節點
- 允許重複的組合
- ES6刪除字串中重複的元素字串
- 隨機列印0-100的全部數字並且不可重複,時間複雜度為O(n)隨機時間複雜度
- Java從List中獲取隨機元素Java隨機
- JavaScript 拼接多個陣列並刪除重複元素JavaScript陣列
- JavaScript 獲取0-1之間的隨機數JavaScript隨機
- 獲取當前時間戳和隨機數的獲取、Java Random、ThreadLocalRandom、UUID類中的方法應用(隨機數)時間戳隨機JavarandomthreadUI
- 建立元素和刪除元素
- JZ-069-在 O(1) 時間內刪除連結串列節點
- 時間複雜度O(1)、O(n)、O(n²)、O(nlogn)的含義時間複雜度
- 時間複雜度O(n)和空間複雜度時間複雜度
- JavaScript基礎 釋出評論/刪除評論/獲取時間JavaScript
- mysql 刪除重複項MySql
- 刪除oracle重複值Oracle
- JavaScript 刪除重複字元JavaScript字元
- 刪除重複資料
- cookie的設定、獲取和刪除Cookie
- leetcode-刪除排序陣列中的重複項+移除元素LeetCode排序陣列
- 演算法題:O(1)時間複雜度實現獲取棧的最大值、最小值演算法時間複雜度
- LeetCode26、27 刪重複元素LeetCode
- 力扣-83. 刪除排序連結串列中的重複元素力扣排序
- 83. 刪除排序連結串列中的重複元素(JavaScript版)排序JavaScript
- leetcode-82:刪除排序連結串列中重複的元素-iiLeetCode排序
- mongodb刪除重複資料MongoDB
- VSCode刪除重複的空行VSCode
- JavaScript 刪除字串重複字元JavaScript字串字元
- Qt:獲取日期和時間QT
- JS 不使用 for forEach 獲取兩陣列中重複的元素JS陣列
- 小測試:HashSet可以插入重複的元素嗎?