首页 > 其他分享 >【LBLD】常数时间删除-查找数组中的任意元素

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

时间:2023-04-17 21:33:06浏览次数:32  
标签:return val nums int blacklist 查找 数组 num2index 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;
    }
};

标签:return,val,nums,int,blacklist,查找,数组,num2index,LBLD
From: https://www.cnblogs.com/yangxuanzhi/p/17327589.html

相关文章

  • 轮换数组——给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数
    示例输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]这里使用reverse函数来解决问题,思路是:1.反转整个字符串2.反转区间为前k的子串3.反转区间为k到末尾的......
  • 定义函数数组
    interfaceFunctionArrayInterface//定义接口,希望批量执行的函数用统一的名称定义在接口内{voidrunit();}classfuncAimplementsFunctionArrayInterface//函数A{publicvoidrunit(){System.out.println("你运行了函数func......
  • 查找自己农历生日与公历生日在同一天的年份
    #请先使用命令pipinstallsxtwl安装依赖库后,再执行以下脚本importsxtwlymc=["正","二","三","四","五","六","七","八","九","十","冬","腊"]rmc=[&quo......
  • 查找消耗cpu最高的Java进程
    #!/bin/bashif[-z"$1"];then###1.先找到消耗cpu最高的Java进程###pid=`ps-eopid,%cpu,cmd--sort=-%cpu|grepjava|grep-vgrep|head-1|awk'END{print$1}'`if["$pid"=""];then......
  • 第五章 数组
    5.1数组的概述5.1.1数组的定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称为一个数据元素,每一个数据元素可以通过一个下标来访问他们。5.2数组的声明创建5.2.1数组的声明与创建首先必......
  • linux系统查找文件命令find,xargs
    FIND命令形式:findpathname-options[-print-exec-ok]pathname要查找的路径(.表示当前目录,/表示系统根目录)-print输出-exec 对匹配的文件执行该参数所给出的shell命令-execrm{}\;注意{}和\;之间的空格-ok以一种更为安全的模式来执行shell命令find命令有很多选项或表达式,每一......
  • reduce 构建新对象或者 数组
    //原对象constinfo=[{name:"A",value:4,},{name:"B",value:7,},{name:"C",value:10,}];//期望对象{A:4,B:7,C:10,}//reduce:co......
  • C# 数组深拷贝浅拷贝
    1bool[]tmp1={true,true};2bool[]tmp2;34//tmp2=tmp1;//浅拷贝更改tmp2会影响tmp156tmp2=(bool[])tmp1.Clone();//克隆深拷贝更改tmp2不会影响tmp178tmp2[0]=false;9......
  • 动态规划:剑指 Offer 42. 连续子数组的最大和
    题目描述:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 提示:1<= arr.length<=10^5-100<=arr[i]<=100   classSolution{publicintmaxSubArray(intnums[]){intres......
  • 远程的文件转换成byte数组
    1、使用OkHttp3库来将远程的GIF文件转换成InputStreamOkHttpClientclient=newOkHttpClient();Requestrequest=newRequest.Builder().url("http://xxxxx/resources/upload/20230414/3_yk_anim_cn_64_1.gif").build();......