常數時間插入刪除獲取元素


刪除的時候,交換最後一個元素與被刪除元素,然後pop最後一個元素。記錄交換元素的新位置,寫入hashmap。

插入查詢map發現存在則不插入,如果不存在則push_back。

刪除查詢map發現不存在則不刪除,如果存在則與最後一位元素交換然後pop。

class RandomizedSet {
public:
    // 存儲元素的值
    vector<int> nums;
    // 記錄每個元素對應在 nums 中的索引
    unordered_map<int,int> valToIndex;

    bool insert(int val) {
        // 若 val 已存在,不用再插入
        if (valToIndex.count(val)) {
            return false;
        }
        // 若 val 不存在,插入到 nums 尾部,
        // 並記錄 val 對應的索引值
        valToIndex[val] = nums.size();
        nums.push_back(val);
        return true;
    }

    bool remove(int val) {
        // 若 val 不存在,不用再刪除
        if (!valToIndex.count(val)) {
            return false;
        }
        // 先拿到 val 的索引
        int index = valToIndex[val];
        // 將最後一個元素對應的索引修改爲 index
        valToIndex[nums.back()] = index;
        // 交換 val 和最後一個元素
        swap(nums[index], nums.back());
        // 在數組中刪除元素 val
        nums.pop_back();
        // 刪除元素 val 對應的索引
        valToIndex.erase(val);
        return true;
    }

    int getRandom() {
        // 隨機獲取 nums 中的一個元素
        return nums[rand() % nums.size()];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章