题意:设计一个数据结构,支持添加,删除和随机获取元素,允许元素重复,要求时间复杂度为O(1)

思路:因为要求允许元素重复,可能用key=>set的映射方式,其中set表示相同元素对应的下标。用list来顺序添加元素

关键是删除操作,如果删除的元素不是在list的最后一个元素,将其与最后元素交换,同时更新元素对应的位置set

更新也要按照一定的顺序来操作,删除元素对应的位置,同时更新最后一个元素的位置。因类删除的元素可能与最后一个元素相等

代码如下:

public class RandomizedCollection {private Map<Integer, Set<Integer>> map;private List<Integer> list;private Random random;/** Initialize your data structure here. */public RandomizedCollection() {map = new HashMap<>();list = new ArrayList<>();random = new Random();}/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */public boolean insert(int val) {boolean notHasVal = true;if (map.containsKey(val)) notHasVal = false;int len = list.size();list.add(val);if (!map.containsKey(val)){Set<Integer> set = new HashSet<>();set.add(len);map.put(val, set);}else{map.get(val).add(len);}return notHasVal;}/** Removes a value from the collection. Returns true if the collection contained the specified element. */public boolean remove(int val){if (!map.containsKey(val)) return false;int index = map.get(val).iterator().next();int size = list.size();int num = 0;if (index != size - 1){int tmp = list.get(index);num = list.get(size - 1);list.set(index, num);list.set(size - 1, tmp);}list.remove(size - 1);map.get(val).remove(index);if (index != size - 1){map.get(num).remove(size - 1);map.get(num).add(index);}if (map.get(val).size() == 0){map.remove(val);}return true;}/** Get a random element from the collection. */public int getRandom(){return list.get(random.nextInt(list.size()));}
}

LeetCode Insert Delete GetRandom O(1) - Duplicates allowed相关推荐

  1. leetcode381. Insert Delete GetRandom O(1) - Duplicates allowed

    题目要求 Design a data structure that supports all following operations in average O(1) time.Note: Dupli ...

  2. LeetCode Insert Delete GetRandom O(1)

    题意:设计一个数据结构,支持添加.删除,随机获取操作,时间复杂度为O(1) 思路:因为元素不重复,在添加操作时,可以使用hashset和arraylist来做,其中hashset中的key表示添加的元 ...

  3. leetcode 380. Insert Delete GetRandom O(1) | 380. O(1) 时间插入、删除和获取随机元素(Java)

    题目 https://leetcode.com/problems/insert-delete-getrandom-o1/ 题解 一个设计题,没想出来,参考了: Java solution using ...

  4. 触发器实现两表之间的INSERT,DELETE,UPDATE

    需求说明:培训记录处录入"外出培训"记录,保存后同步外出培训合同至"合同模块" 培训记录表PX_Record创建触发器 步骤一.新建触发器:[insert_ht ...

  5. MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器

    在MySQL5.6版本里,不支持一个表有多个INSERT/DELETE/UPDATE触发器. 例如创建t1表两个INSERT的触发器: DELIMITER $$ USE `test`$$ DROP T ...

  6. SQL server触发器中 update insert delete 分别给写个例子被。

    SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...

  7. Innodb锁系统 Insert/Delete 锁处理及死锁示例分析

    A.INSERT 插入操作在函数btr_cur_optimistic_insert->btr_cur_ins_lock_and_undo->lock_rec_insert_check_an ...

  8. mysql 5.7 insert_MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器

    在MySQL5.6版本里,不支持一个表有多个INSERT/DELETE/UPDATE触发器. 例如创建t1表两个INSERT的触发器:DELIMITER $$ USE `test`$$ DROP TR ...

  9. oracle中update,insert,delete的高级用法

    一.对视图的更新. update,insert,delete除了可以作用于单表,还可以作用于视图.子查询,但是有种种限制. 视图(子查询)的限制:   1.没有集合操作符(并.差.交): 2.没有DI ...

最新文章

  1. Android studio 不显示自定义View 的提示
  2. nchoosek--二项式系数或所有的组合数
  3. 1.10.Flink DataStreamAPI(API的抽象级别、Data Sources、connectors、Source容错性保证、Sink容错性保证、自定义sink、partition等)
  4. CF682C Alyona and the Tree
  5. 怎样创建数据库?4种流行数据库的创建方法介绍
  6. APPSCAN学习目录
  7. Java程序员面试应该准备什么?
  8. GNN-频域-2016:ChebNet【频谱图卷积】【切比雪夫多项式(ChebShev Polynomial)】【应用切比雪夫多项式加速特征矩阵求解】【GCN来源于对ChebNet的进一步简化与近似】
  9. 迈达斯导出html计算书,动态计算书模块功能-midas Civil 2011
  10. element-ui表格编辑
  11. Win11键盘锁住怎么恢复?
  12. Oracle物化视图的刷新
  13. 聚焦云+人工智能,纳德拉宣布微软重大重组
  14. raster包—stack函数
  15. MapReduce处理流程wordCount源码解析和操作流程
  16. 微信域名防封系统-微信域名预拦截预防封
  17. 【2020年天梯赛校选赛】7-16 愤怒的牛
  18. 【jzoj2182】羊羊吃草
  19. js学习笔记-2018年7月12日
  20. WIN10笔记本屏幕亮度无法调节,一直是最高亮度

热门文章

  1. zigbee学习之路(二)点亮LED
  2. 汇编程序-更灵活的定位内存地址方法
  3. Lombok(1.14.8) - @Synchronized
  4. 学习使用ASP对象和组件
  5. 【SQL Server学习笔记】变更数据捕获(Change Data Capture)
  6. 实验二 建立基本的游戏场景
  7. 开始喜欢Python了
  8. python编程语言的缺点-常见的AI编程语言优缺点比较,程序员千万不要入错行!...
  9. python利器怎么用-UliPad 初体验----python 开发利器
  10. vb和python-vb与python