热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode380.InsertDeleteGetRandomO(1)思路详解

原题DesignadatastructurethatsupportsallfollowingoperationsinaverageO(1)time.1,insert

原题

Design a data structure that supports all following operations in average O(1) time.
1,insert(val): Inserts an item val to the set if not already present.
2,remove(val): Removes an item val from the set if present.
3,getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.


题目翻译

设计一个数据结构,该数据可以在O(1)时间内完成以下操作:
1,insert(val):插入一个元素到集合中,如果元素之前不存在。
2,remove(val):如果val在集合中存在,则删除
3,getRandom:返回当前集合中随机的一个数。每个元素返回的概率相同。


思路解析

由于题目要求删除和插入的时间复杂度均为O(1)。首先想到使用数组保存所有数据。这样的话,插入时间复杂度为O(n)。但是删除数据的时间复杂度为O(n)。随机返回操作时间复杂度为O(n)。如何实现O(1)。我们使用一个map来保存数据-位置关系。然后使用vector来保存元素。
1,insert操作。首先判断val在map中是否存在,时间复杂度为O(1)。如果存在,则返回false。否则,将数据插入到vector中。然后在map中保存数据-位置键值对。时间复杂度为O(1)

2,remove操作。首先判断val在map中是否存在,时间复杂度为O(1)。如果不存在,则返回false。否则,首先将val的所在位置保存vector尾部元素的值。修改尾部数据的在map中的位置映射。以及val的位置映射。然后删除val在map中映射关系。然后删除vector中最后一个元素。此时时间负责度为O(1)

3,getRandom操作。有rand()函数产生随机的位置pos。然后返回vector中pos处的元素即可


代码

class RandomizedSet {
public:map data_map; //数字 - 对应位置vector data;/** 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(data_map.count(val) != 0){return false;}else{data.push_back(val); //在数组中插入该值data_map[val] = data.size()-1; //在map中加入该值和数组中的位置对应return true;}}/** Removes a value from the set. Returns true if the set contained the specified element. */bool remove(int val) {//查找是是否在map中存在,如果不存在则返回falseif(data_map.count(val) == 0){return false;}else{//否则,和数组尾部数据位置交换,删除掉尾部数据int tail = data[data.size()-1];int pos1 = data_map[val]; //获取需要删除数据的位置int pos2 = data.size()-1; //最后一个元素的位置data_map[tail] = pos1;data_map[val] = pos2;data[pos1] = tail; //将需要删除的元素和尾部元素交换data_map.erase(val); //删除哈希表中的数据data.pop_back(); //删除数组中的datareturn true;}}/** Get a random element from the set. */int getRandom() {int t = data.size();int random_num = rand()%t;return data[random_num];}
};

推荐阅读
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 在Java编程中,为了提高代码的可读性和执行效率,建议优先使用局部变量来存储方法的返回值,而不是多次调用同一个方法。这样不仅可以减少方法调用的开销,还能避免潜在的性能问题。此外,使用局部变量还可以增强代码的可维护性和调试便利性。 ... [详细]
  • 本周课程涵盖了高精度计算、前缀和及差分技术。在高精度计算部分,我们将探讨如何处理任意进制的数值运算,包括但不限于正数的加法、减法和乘法。通过调整基数,可以灵活应对不同进制的需求。前缀和与差分技术则主要用于高效解决数组和区间查询问题,提升算法性能。 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 深入解析 UIImageView 与 UIImage 的关键细节与应用技巧
    本文深入探讨了 UIImageView 和 UIImage 的核心特性及应用技巧。首先,详细介绍了如何在 UIImageView 中实现动画效果,包括创建和配置 UIImageView 实例的具体步骤。此外,还探讨了 UIImage 的加载方式及其对性能的影响,提供了优化图像显示和内存管理的有效方法。通过实例代码和实际应用场景,帮助开发者更好地理解和掌握这两个重要类的使用技巧。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • Prim算法在处理稠密图时表现出色,尤其适用于边数远多于顶点数的情形。传统实现的时间复杂度为 \(O(n^2)\),但通过引入优先队列进行优化,可以在点数为 \(m\)、边数为 \(n\) 的情况下显著降低时间复杂度,提高算法效率。这种优化方法不仅能够加速最小生成树的构建过程,还能在大规模数据集上保持良好的性能表现。 ... [详细]
  • 在Unity3D中,获取游戏对象有多种实用技巧和方法。除了常见的序列化变量拖拽方式外,还可以使用 `GameObject.Find()` 方法通过对象名称或路径来直接获取游戏对象。此外,`Transform.Find()` 和 `GameObject.FindWithTag()` 也是常用的手段,分别适用于通过层级结构和标签来查找游戏对象。这些方法各有优劣,开发者可以根据具体需求选择最合适的方式。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文深入探讨了在Android应用开发中常见的相机连接故障问题,特别是在RK3288平台和Android 6.0系统上。通过分析具体案例,本文提供了详细的解决方案和应对策略,旨在帮助开发者有效解决相机连接问题,提升应用的稳定性和用户体验。 ... [详细]
author-avatar
不乱于心丨不困于丶情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有