Leetcode:Insert Delete GetRandom O(1)
来源:互联网 发布:java list 拼接字符串 编辑:程序博客网 时间:2024/06/06 00:56
链接:
https://leetcode.com/problems/insert-delete-getrandom-o1/#/description
题目描述:
Design a data structure that supports all following operations in average O(1) time.
insert(val): Inserts an item val to the set if not already present.remove(val): Removes an item val from the set if present.getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.
解题思路:
该题目第一反应是需要使用map 或者set(set 内部实现也是map)的数据结构。使用map可以支持insert和remove操作,但是要完成getRandom操作就不行了。为了解决getRandom的问题,我们可以选择map和list组合,map存储val和位置的映射关系,list存储val.
注意:
1. 删除的时候需要支持O(1)操作,对于数组如果从中间删除元素,那么后面的元素都需要向前移动,所以使用小技巧,用list中最后的元素替换要删除的元素,然后删除最后的元素。2. 删除元素的时候注意更新map元素的映射位置。
代码如下:
public class RandomizedSet { private Map<Integer,Integer> cache; private List<Integer> elements; private Random random; /** Initialize your data structure here. */ public RandomizedSet() { cache = new HashMap<Integer,Integer>(); elements = new ArrayList<>(); random = new Random(); } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ public boolean insert(int val) { if(cache.containsKey(val)) return false; cache.put(val,elements.size()); elements.add(val); return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ public boolean remove(int val) { if(!cache.containsKey(val)) return false; int index = cache.get(val); int size = elements.size(); if(index!=size-1){ int last = elements.get(size-1); elements.set(index,last); cache.put(last,index); } elements.remove(size-1); cache.remove(val); return true; } /** Get a random element from the set. */ public int getRandom() { int index = random.nextInt(elements.size()); return elements.get(index); }}
阅读全文
0 0
- 【leetcode】Insert Delete GetRandom O(1)
- 【Leetcode】Insert Delete GetRandom O(1)
- LeetCode[380] Insert Delete GetRandom O(1)
- Leetcode 之 Insert Delete GetRandom O(1)
- LeetCode:381 Insert Delete GetRandom O(1)
- leetcode之 Insert Delete GetRandom O(1)
- [leetcode] 380. Insert Delete GetRandom O(1)
- leetcode 380.Insert Delete GetRandom O(1)
- LeetCode Insert Delete GetRandom O(1)
- [LeetCode]380. Insert Delete GetRandom O(1)
- LeetCode 380---Insert Delete GetRandom O(1)
- 【Leetcode】380. Insert Delete GetRandom O(1)
- LeetCode 380. Insert Delete GetRandom O(1)
- 【leetcode】380. Insert Delete GetRandom O(1)
- Leetcode 380. Insert Delete GetRandom O(1)
- Leetcode:Insert Delete GetRandom O(1)
- 【LeetCode】Insert Delete GetRandom O(1) 系列
- Leetcode 380 Insert Delete GetRandom O(1)
- Spark RDD概念学习系列之RDD的转换图解
- [李景山php] linux 的进程组和会话
- Linux和win7双系统时间错误问题
- 【Linux】中管道的几种情况
- SDUT 1006-->Sum Problem
- Leetcode:Insert Delete GetRandom O(1)
- 大数据学习记录(day6)-图说Mapreduce工作机制
- 【模板】树的直径 DP (模板题:XJOI数字转换)
- JVM学习06:运行时数据区域-运行时常量池
- 561. Array Partition I
- ThreadPoolExecutor + Runnable
- 混淆矩阵,机器学习评价准则,ROC曲线-阈值评价标准
- SDUT 1007--> Financial Management
- 学习笔记