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

LeetCode 381: O(1) 时间插入、删除和获取随机元素 - 允许重复

在这里插入图片描述

与Leetcode380不同的是,这道题允许元素重复

代码逻辑

1. 插入操作
public boolean insert(int val) {arr.add(val);  // 直接添加到数组末尾HashSet<Integer> set = map.getOrDefault(val, new HashSet<Integer>());set.add(arr.size() - 1);  // 记录该元素在数组中的索引map.put(val, set);return set.size() == 1;  // 如果是第一次插入,返回 true
}

将元素添加到数组末尾,同时在 HashMap 中记录其索引位置。

2. 删除操作
public boolean remove(int val) {if (!map.containsKey(val)) {return false;}// 获取要删除元素的任意一个索引HashSet<Integer> valSet = map.get(val);int valAnyIndex = valSet.iterator().next();// 获取数组末尾元素int endValue = arr.get(arr.size() - 1);if (val == endValue) {// 特殊情况:要删除的就是末尾元素valSet.remove(arr.size() - 1);} else {// 将末尾元素移动到要删除的位置HashSet<Integer> endValueSet = map.get(endValue);endValueSet.add(valAnyIndex);  // 末尾元素有了新位置arr.set(valAnyIndex, endValue);  // 更新数组endValueSet.remove(arr.size() - 1);  // 移除末尾位置valSet.remove(valAnyIndex);  // 移除被删除元素的位置}arr.remove(arr.size() - 1);  // 删除数组末尾if (valSet.isEmpty()) {map.remove(val);  // 如果该值已经没有了,从 map 中删除}return true;
}

ArrayList 删除中间元素是 O(n) 操作,但删除末尾元素是 O(1),因此我们把要删除的元素和末尾元素交换,然后删除末尾。

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

完整代码

class RandomizedCollection{public HashMap<Integer,HashSet<Integer>> map;public ArrayList<Integer> arr;public RandomizedCollection(){map = new HashMap<>();arr = new ArrayList<>();}public boolean insert(int val) {arr.add(val);  // 直接添加到数组末尾HashSet<Integer> set = map.getOrDefault(val, new HashSet<Integer>());set.add(arr.size() - 1);  // 记录该元素在数组中的索引map.put(val, set);return set.size() == 1;  // 如果是第一次插入,返回 true}public boolean remove(int val) {if (!map.containsKey(val)) {return false;}// 获取要删除元素的任意一个索引HashSet<Integer> valSet = map.get(val);int valAnyIndex = valSet.iterator().next();// 获取数组末尾元素int endValue = arr.get(arr.size() - 1);if (val == endValue) {// 特殊情况:要删除的就是末尾元素valSet.remove(arr.size() - 1);} else {// 将末尾元素移动到要删除的位置HashSet<Integer> endValueSet = map.get(endValue);endValueSet.add(valAnyIndex);  // 末尾元素有了新位置arr.set(valAnyIndex, endValue);  // 更新数组endValueSet.remove(arr.size() - 1);  // 移除末尾位置valSet.remove(valAnyIndex);  // 移除被删除元素的位置}arr.remove(arr.size() - 1);  // 删除数组末尾if (valSet.isEmpty()) {map.remove(val);  // 如果该值已经没有了,从 map 中删除}return true;}public int getRandom(){return arr.get((int) (Math.random()*arr.size()));}}
http://www.dtcms.com/a/519548.html

相关文章:

  • 一次RedisOOM 排查
  • MongoDB迁移到KES实战全纪录(下):性能优化与实践总结
  • 【Java 开发日记】我们来讲一讲阻塞队列及其应用
  • 免费网站统计代码农业电商平台有哪些
  • 在长沙做网站需要多少钱手机网页禁止访问解除
  • IEEE754是什么?
  • [lc-rs] 树|建桥贪心
  • 状压DP:从入门到精通
  • Open-webui
  • AIDD - 前沿生物科技 自主决策实验 (Autonomous Experimentation) 的简述
  • 网络管理员教程(初级)第六版--第5章网络安全及管理
  • 怎么创建自己的公司网站开发公司总工程师职责
  • AI问答:rust自定义Drop如何手动释放内存?
  • JetPack 6.0 / Ubuntu 22.04 (L4T 36.x )一键彻底关闭自动更新脚本
  • 【展厅多媒体】展厅小知识:VR体感游戏推动展厅数字化转型
  • MySQL部署
  • ubuntu中为什么查看CPU的步进?查看命令是什么?
  • 【2025】libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent
  • 广告设计网站免费樟树市建设局网站
  • Redis Jedis 快速入门
  • 未来之窗昭和仙君(三十一)全球化多国语言——东方仙盟筑基期
  • 面试常问笔记整理
  • 如何提高技能和知识
  • 小白python入门 - 6. Python 分支结构——逻辑决策的核心机制
  • 证件阅读器在酒店案例
  • 免费做app的网站有哪些物流公司网站怎么做
  • 公司网站制作商濮阳到上海
  • 网络编程-初识
  • 十六、OpenCV中的图像文件处理
  • 你的图表太安静了!3行代码让Highcharts“开口说话“