Insert Delete GetRandom O(1)
来源:互联网 发布:诸葛诞 知乎 编辑:程序博客网 时间:2024/04/29 13:32
Design a data structure that supports all following operations in averageO(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 thesame probability of being returned.
Example:
// Init an empty set.RandomizedSet randomSet = new RandomizedSet();// Inserts 1 to the set. Returns true as 1 was inserted successfully.randomSet.insert(1);// Returns false as 2 does not exist in the set.randomSet.remove(2);// Inserts 2 to the set, returns true. Set now contains [1,2].randomSet.insert(2);// getRandom should return either 1 or 2 randomly.randomSet.getRandom();// Removes 1 from the set, returns true. Set now contains [2].randomSet.remove(1);// 2 was already in the set, so return false.randomSet.insert(2);// Since 1 is the only number in the set, getRandom always return 1.randomSet.getRandom();思路:需要查找O(1),肯定需要hashmap,random需要O(1), 那么就会想到需要知道size,delete的话,需要知道index就可以实现O(1),但是delete之后,之后的元素都要顺移,这不行,会O(n),如果把最后的一个元素跟delete的元素换一下,然后更新hashmap的里面的index值,那就可以实现O(1)。
所以最终解法就是: HashMap + ArrayList. Delete需要特殊处理一下。更新hashmap和arraylist,这里需要熟知hashmap的remove和arraylist的remove。
应该记得先update一下list,然后 update hashmap,这样写,思路清晰;
public class RandomizedSet { /** Initialize your data structure here. */ private HashMap<Integer, Integer> hashmap; private List<Integer> list; public RandomizedSet() { hashmap = new HashMap<Integer, Integer>(); list = new ArrayList<Integer>(); } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ public boolean insert(int val) { if(hashmap.containsKey(val)){ return false; } else { list.add(val); hashmap.put(val, list.size()-1); return true; } } /** Removes a value from the set. Returns true if the set contained the specified element. */ public boolean remove(int val) { if(!hashmap.containsKey(val)){ return false; } else { int index = hashmap.get(val); int lastval = list.get(list.size()-1); list.set(index, lastval); hashmap.put(lastval, index); list.remove(list.size()-1); hashmap.remove(val); return true; } } /** Get a random element from the set. */ public int getRandom() { int index = (int)(Math.random()*list.size()); return list.get(index); }}/** * Your RandomizedSet object will be instantiated and called as such: * RandomizedSet obj = new RandomizedSet(); * boolean param_1 = obj.insert(val); * boolean param_2 = obj.remove(val); * int param_3 = obj.getRandom(); */
0 0
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1)
- 【leetcode】Insert Delete GetRandom O(1)
- 【Leetcode】Insert Delete GetRandom O(1)
- LeetCode[380] Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1) - Duplicates allowed
- 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)
- 150. Insert Delete GetRandom O(1)
- leetcode 380.Insert Delete GetRandom O(1)
- 380. Insert Delete GetRandom O(1)
- Insert Delete GetRandom O(1) - Duplicates allowed
- java学习之路
- git clone 远程分支
- [noip模拟赛]二进制(dp)
- 后台通用参数校验(JS303规范)
- Session与的Cookie的联系与区别
- Insert Delete GetRandom O(1)
- 程序员基础东东
- Javascript获取select下拉框选中的的值
- 设置ssh连接超时
- 关于Apache Shiro权限框架的一些使用误区的解释
- AVL Tree
- servlet学习笔记---servletContext
- android中对/data/data/<package name>/files下文件的读写操作
- Android初级教程:ViewPage使用详解