首页 > 其他分享 >常数时间对数组进行-删除-查找-随机提取元素

常数时间对数组进行-删除-查找-随机提取元素

时间:2023-10-07 11:55:32浏览次数:31  
标签:return 删除 val nums back umap 查找 数组 常数

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

众所周知,数组这类数据结构可以实现O(1)的获取,所以结合rand()函数就能实现随机获取,但是数组的存储方式又是连续的,这就意味着,插入和删除时需要有大量的元素需要移动,所以不能实现O(1)的插入(末尾除外)和删除。能够实现O(1)的插入和删除的数据结构,有哈希表(可能还有其它,但是暂时没有学习到),通过哈希函数的映射能够实现O(1)的插入和删除,如此本题需要结合数组与哈希表。

插入由于题目意思应该是无需指定位置插入,所以直接插入在末尾处的话,可以直接push_back();

最终实现删除的方法:将要删除的元素替换到数组的末尾,所以需要哈希表来记录删除元素对应的下标。

bool remove(int val) {
        if (umap.find(val) != umap.end()) {
            int index = umap[val];
            umap[nums.back()] = index; // 这是我开始忽略的,实际上也是需要记录最后一个元素调换后的新下标。
            swap(nums[index], nums.back());
            nums.pop_back();
            umap.erase(val);
            return true;
        }
        return false;
    }

完整代码:

class RandomizedSet {
public:
    vector<int> nums;
    unordered_map<int, int> umap;
public:
    
    bool insert(int val) {
        if (umap.find(val) == umap.end()) {
            nums.push_back(val);
            umap[val] = nums.size() - 1;
            return true;
        }
        return false;
    }
    
    bool remove(int val) {
        if (umap.find(val) != umap.end()) {
            int index = umap[val];
            umap[nums.back()] = index;
            swap(nums[index], nums.back());
            nums.pop_back();
            umap.erase(val);
            return true;
        }
        return false;
    }
    
    int getRandom() {
        // 随机获取 nums 中的一个元素
        return nums[rand() % nums.size()];
    }
};

标签:return,删除,val,nums,back,umap,查找,数组,常数
From: https://www.cnblogs.com/H-force/p/17745955.html

相关文章

  • numpy 数组 的 视图和副本
    numpy数组的视图https://zhuanlan.zhihu.com/p/199615109?utm_id=0https://finthon.com/numpy-arrayview-copy/https://blog.csdn.net/weixin_44226181/article/details/128401161 ==================================在编程的过程中很可能会使用到原数组,这就涉及到......
  • Numpy 数组的内部结构组成
    Numpy数组的内部结构组成 下图是Numpy数组的内部结构组成。其中可以分为数组数据结构信息区以及数据存储区。简单来说,数组数据结构信息区中有Numpy数组的形状(shape)以及数据类型(data-type)等信息,而数据存储区则是用于存储数组的数据,Numpy数组中的数据可以指向其它数组中......
  • Numpy 创建随机数数组 随机数组
     创建随机数数组NumPy提供了强大的生成随机数的功能。真正的随机数很难获得,实际中使用的都是伪随机数。大部分情况下,伪随机数就能满足需求。当然,某些特殊情况除外,如进行高精度的模拟实验。对于NumPy,与随机数相关的函数都在random模块中,其中包括了可以生成服从多种概率分布随机数......
  • numpy 数组 的 轴
    numpy数组的轴 1认识“轴”的概念如同笛卡尔坐标系一样,NumPy张量也有轴。现在我们先以熟悉二维向量为例来说明这个概念,二维向量的轴是沿行和列的方向。轴的编号是从0开始的,因此“第一轴”实际上是“axis0”。“第二轴”是“axis1”,依此类推。在可视化观感上,“axis0”就......
  • TypeScript入门到精通——TypeScript类型系统基础——数组类型
    数组类型 数组是十分常用的数据结构,它表示一组有序元素的集合。在TypeScript中,数组值的数据类型为数组类型。一、数组类型定义 TypeScript提供了以下两种方式来定义数组类型:简单数组类型表示法泛型数组类型表示法1.1、简单数组类型表示法在TypeScript中,你可以使......
  • 2310-数组习题
     strlen函数-求字符串长度的,找\0之前出现的字符个数 sizeof-操作符-计算变量/类型所占内存大小,单位是字节答案为A  #include<stdio.h>voidinit(intarr[],intsz){for(inti=0;i<sz;i++)arr[i]=0;}voidprint(intarr[],intsz){......
  • 力扣-2535-数组元素和与数字和的绝对差
    给你一个正整数数组nums。元素和是nums中的所有元素相加求和。数字和是nums中每一个元素的每一数位(重复数位需多次求和)相加求和。返回元素和与数字和的绝对差。注意:两个整数x和y的绝对差定义为|x-y|。 示例1:输入:nums=[1,15,6,3]输出:9解释:nums的元素......
  • 动态规划问题(1)子数组系列
    这几天刷了子数组系列的动态规划题目,在这里写下这篇博客,总结记录一下做这些题目的经验,同时也相当于复习。题目一:最大子数组和题目链接:53.最大子数组和-力扣(LeetCode)当我们看完题目,看完例题之后,发现是一个动态规划的子数组问题。那么做动态规划问题有五步第一步:状态表示对于这种......
  • 为什么处理已排序数组比处理未排序数组更快?
    在这个C++代码中,在计时区域之前对数据进行排序(*)使得主循环快6倍:#include<algorithm>#include<ctime>#include<iostream>intmain(){//生成数据constunsignedarraySize=32768;intdata[arraySize];for(unsignedc=0;c<arraySize;++c)......
  • 力扣-1646-获取生成数组中的最大值
    给你一个整数n。按下述规则生成一个长度为n+1的数组nums:nums[0]=0nums[1]=1当2<=2*i<=n时,nums[2*i]=nums[i]当2<=2*i+1<=n时,nums[2*i+1]=nums[i]+nums[i+1]返回生成数组nums中的最大值。 示例1:输入:n=7输出:3解释:根据规则:......