[M設計+雜湊表] lc380. 常數時間插入、刪除和獲取隨機元素(設計+雜湊表)
1. 題目來源
2. 題目說明
3. 題目解析
設計資料結構,實現三個操作:
- O ( 1 ) O(1) O(1) 插入
- O ( 1 ) O(1) O(1) 刪除
- O ( 1 ) O(1) O(1) 等概率返回一個隨機值
當然,插入、刪除 O ( 1 ) O(1) O(1) 的話雜湊表就能搞定,但是雜湊表不支援等概率返回這個操作,需要有一個支援隨機索引的資料結構,那麼就是陣列了。
開一個雜湊表,建一個陣列:
- 插入時在陣列末尾插入,在雜湊表中維護該數在陣列下的下標,即
<val, index>
- 返回隨機值,陣列支援隨機索引,等概率返回任一數即可
- 刪除,雜湊表可以
O
(
1
)
O(1)
O(1) 刪除。陣列僅支援末尾
O
(
1
)
O(1)
O(1) 刪除。那麼基於這個思想,我們可以把需要刪除的數放到陣列最後一個位置,然後直接
pop_back()
,達到 O ( 1 ) O(1) O(1) 刪除。 當然,也需要在雜湊表中將對應索引進行交換。
這也是陣列實現 O ( 1 ) O(1) O(1) 刪除一個元素的方法,將該元素與末尾元素進行交換後刪除。
程式碼:
class RandomizedSet {
public:
unordered_map<int, int> hash;
vector<int> nums;
/** Initialize your data structure here. */
RandomizedSet() {
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
bool insert(int val) {
if (hash.count(val) == 0) {
nums.push_back(val);
hash[val] = nums.size() - 1;
return true;
}
return false;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
bool remove(int val) {
if (hash.count(val)) {
int y = nums.back();
int pval = hash[val], py = hash[y];
swap(nums[pval], nums[py]);
swap(hash[val], hash[y]);
nums.pop_back();
hash.erase(val);
return true;
}
return false;
}
/** Get a random element from the set. */
int getRandom() {
return nums[rand() % nums.size()];
}
};
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet* obj = new RandomizedSet();
* bool param_1 = obj->insert(val);
* bool param_2 = obj->remove(val);
* int param_3 = obj->getRandom();
*/
相關文章
- 雜湊表(雜湊表)原理詳解
- 2024.9.4 leetcode 169 多數元素 (雜湊表)LeetCode
- 雜湊表
- 【尋跡#3】 雜湊與雜湊表
- 資料結構,雜湊表hash設計實驗資料結構
- O(1) 時間插入、刪除和獲取隨機元素,允許元素重複隨機
- 雜湊表2
- 字串雜湊表字串
- 6.7雜湊表
- 線性表 & 雜湊表
- 幾道和雜湊(雜湊)表有關的面試題面試題
- iOS雜湊表快取窺探iOS快取
- 十二、雜湊表(二)
- 十一、雜湊表(一)
- 雜湊表應用
- 手寫雜湊表
- 雜湊表的原理
- LeetCode705.設計雜湊集合LeetCode
- Python:說說字典和雜湊表,雜湊衝突的解決原理Python
- JAVA 實現 - 雜湊表Java
- freeswitch APR庫雜湊表
- 力扣-705. 設計雜湊集合力扣
- 14-2 雜湊函式設計函式
- 【閱讀筆記:雜湊表】Javascript任何物件都是一個雜湊表(hash表)!筆記JavaScript物件
- LeetCode381. O(1) 時間插入、刪除和獲取隨機元素 - 允許重複LeetCode隨機
- Hash,雜湊,雜湊?
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- 圖解兩數之和:雜湊表法圖解
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- 資料結構——雜湊表資料結構
- 雜湊表的一點思考
- 力扣-706. 設計雜湊對映力扣
- 347前 K 個高頻元素(雜湊表、堆排序)排序
- 2024/12/5 【雜湊表】202 快樂數
- 【六褘-Java】雜湊演算法記憶體圖;set集合低層採用雜湊表儲存元素;雜湊演算法的流程Java演算法記憶體
- 七夕也要學起來,雜湊雜湊雜湊!
- 雜湊競猜開發原理丨雜湊競猜遊戲原始碼丨雜湊競猜系統開發設計程式碼遊戲原始碼
- 菜鳥學Python之雜湊表Python