【LBLD】常数时间删除-查找数组中的任意元素

常数时间删除-查找数组中的任意元素

380. O(1) 时间插入、删除和获取随机元素

class RandomizedSet {
private:
    vector<int> nums;
    unordered_map<int, int> num2index;
public:
    RandomizedSet() {
        srand(time(0));
    }
    
    bool insert(int val) {
        if (num2index.count(val)) {
            return false;
        }
        num2index.emplace(val, nums.size());
        nums.push_back(val);
        return true;
    }
    
    bool remove(int val) {
        if (!num2index.count(val)) {
            return false;
        }
        int index = num2index[val];
        int lastIndex = nums.size() - 1;
        if (index != lastIndex) {
            nums[index] = nums[lastIndex];
            num2index[nums[index]] = index;
        }
        num2index.erase(val);
        nums.pop_back();
        return true;
    }
    
    int getRandom() {
        int randIndex = rand() % nums.size();
        return nums[randIndex];
    }
};

710. 黑名单中的随机数

class Solution {
private:
    int N_n, N_blacklist;
    vector<int> nums;
    unordered_map<int, int> black2num;

public:
    Solution(int n, vector<int>& blacklist) {
        srand(time(0));
        N_n = n; N_blacklist = blacklist.size();
        for (int num : blacklist) {
            black2num.emplace(num, num);
        }
        
        int i = N_n - 1;
        for (auto& it : black2num) {
            if (it.first >= N_n - N_blacklist) continue;
            while (black2num.count(i)) i--;
            it.second = i;
            i--;
        }
    }
    
    int pick() {
        int randNum = rand() % (N_n - N_blacklist);
        if (black2num.count(randNum)) {
            randNum = black2num[randNum];
        }
        return randNum;
    }
};
posted @   杨谖之  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示
主题色彩