当前位置: 首页 > news >正文

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

在这里插入图片描述
这道题的难点在于如何同时满足三个 O(1) 操作,尤其是随机获取元素

代码逻辑

1. 插入操作 (insert)
public boolean insert(int val) {if (map.containsKey(val)) {return false;  // 元素已存在}map.put(val, arr.size());  // 记录新元素的索引arr.add(val);               // 添加到数组末尾return true;
}
2. 删除操作 (remove)

直接从数组中间删除元素的时间复杂度是 O(n),因此本文采用交换删除法:

public boolean remove(int val) {if (!map.containsKey(val)) {return false;  // 元素不存在}// 获取要删除元素的索引int valIndex = map.get(val);// 获取数组最后一个元素int endValue = arr.get(arr.size() - 1);// 用最后一个元素覆盖要删除的元素map.put(endValue, valIndex);arr.set(valIndex, endValue);// 删除 map 中的记录和数组末尾元素map.remove(val);arr.remove(arr.size() - 1);return true;
}

将要删除的元素与数组最后一个元素交换,然后删除末尾元素,这样删除操作就是 O(1) 了!

3. 随机获取 (getRandom)
public int getRandom() {return arr.get((int) (Math.random() * arr.size()));
}

使用了 ArrayList,可以通过索引 O(1) 访问任意元素,配合随机数生成器即可实现等概率随机返回。

完整代码

class RandomizedSet{public HashMap<Integer,Integer> map;public ArrayList<Integer> arr;public RandomizedSet(){map = new HashMap<>();arr = new ArrayList<>();}public boolean insert(int val) {if (map.containsKey(val)) {return false;  // 元素已存在}map.put(val, arr.size());  // 记录新元素的索引arr.add(val);               // 添加到数组末尾return true;}public boolean remove(int val) {if (!map.containsKey(val)) {return false;  // 元素不存在}// 获取要删除元素的索引int valIndex = map.get(val);// 获取数组最后一个元素int endValue = arr.get(arr.size() - 1);// 用最后一个元素覆盖要删除的元素map.put(endValue, valIndex);arr.set(valIndex, endValue);// 删除 map 中的记录和数组末尾元素map.remove(val);arr.remove(arr.size() - 1);return true;}public int getRandom(){return arr.get((int) (Math.random()*arr.size()));}}
http://www.dtcms.com/a/516948.html

相关文章:

  • Vue2 与 Vue3 父子组件参数传递全解析:从实例到原理
  • html网站登陆注册怎么做爱奇艺会员做任务送十天网站
  • win7 网站配置微信小商店分销系统
  • SQL sever数据库--第二次作业
  • less使用说明
  • 重庆荣昌网站建设价格南京制作网站培训学校
  • 电脑网站和手机网站怎么做相同路径电商网站产品模块
  • 仿真系列专栏介绍
  • 系统集成项目管理工程师第六章:数据工程(精简版)
  • [lc-rs] 双指针
  • 建设网站的目的98建筑网站
  • 招远建网站中山网站优化营销
  • unity基础学习笔记<下>
  • [人工智能-大模型-40]:模型层技术 - 无监督式学习、学习的目标、收敛条件、评估依据 - 通俗易懂
  • 大模型微调(四):人类反馈强化学习(RLHF)
  • 自动化实战 Playwright破解滑块验证码的完整实战指南
  • 网站建设公司上海做网站公司哪家好云南网站做的好的公司哪家好
  • sql 按照前端传的数组里的值进行自定义排序
  • 网站备案更换主体电子商务后悔死了
  • Python_封装案例
  • 查找5个搜索引擎作弊的网站普通网站建设的缺陷
  • 卫浴网站模板获取网站开发语言
  • 网站的盈利点企业建站的作用是什么
  • 哪里有网站建设培训班二级a做爰片免费网站
  • kmp需要技能
  • 大岭山网站仿做杭州家装口碑比较好的公司
  • 【Pycharm】Debug展示完整Tensor
  • [iOS] 计算器仿写
  • 北京专业网站制作公司家在深圳龙光城
  • Blender学习-基础移动