[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();
*/
相關文章
- 雜湊表(雜湊表)詳解
- 雜湊表(雜湊表)原理詳解
- 雜湊表
- 深入理解雜湊表(JAVA和Redis雜湊表實現)JavaRedis
- 【尋跡#3】 雜湊與雜湊表
- 字串雜湊表字串
- 6.7雜湊表
- 查詢(3)--雜湊表(雜湊查詢)
- 資料結構,雜湊表hash設計實驗資料結構
- 幾道和雜湊(雜湊)表有關的面試題面試題
- O(1) 時間插入、刪除和獲取隨機元素,允許元素重複隨機
- iOS雜湊表快取窺探iOS快取
- 雜湊表應用
- 雜湊表的原理
- 實現雜湊表
- 淺談雜湊表
- 符號表與雜湊表符號
- R語言——雜湊表R語言
- JAVA 實現 - 雜湊表Java
- 【閱讀筆記:雜湊表】Javascript任何物件都是一個雜湊表(hash表)!筆記JavaScript物件
- 14-2 雜湊函式設計函式
- 力扣-705. 設計雜湊集合力扣
- 圖解兩數之和:雜湊表法圖解
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- Python:說說字典和雜湊表,雜湊衝突的解決原理Python
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- java 雜湊表和執行緒安全Java執行緒
- 資料結構——雜湊表資料結構
- freeswitch APR庫雜湊表
- 談談面試--雜湊表系列面試
- 雜湊表(Hash)的應用
- LeetCode705.設計雜湊集合LeetCode
- 347前 K 個高頻元素(雜湊表、堆排序)排序
- 雜湊遊戲系統技術開發丨雜湊單雙競猜遊戲原始碼丨雜湊遊戲程式設計技術遊戲原始碼程式設計
- 雜湊競猜開發原理丨雜湊競猜遊戲原始碼丨雜湊競猜系統開發設計程式碼遊戲原始碼
- 2024.9.4 leetcode 169 多數元素 (雜湊表)LeetCode
- 第23章:列表、陣列和雜湊表陣列
- 【六褘-Java】雜湊演算法記憶體圖;set集合低層採用雜湊表儲存元素;雜湊演算法的流程Java演算法記憶體