[LeetCode] Insert Delete GetRandom O(1)
来源:互联网 发布:dnf数据芯片和魔刹石 编辑:程序博客网 时间:2024/06/08 03:38
Design a data structure that supports all following operations in average O(1) time.
Note: Duplicate elements are allowed.insert(val)
: Inserts an item val to the collection.remove(val)
: Removes an item val from the collection if present.getRandom
: Returns a random element from current collection of elements. The probability of each element being returned is linearly related to the number of same value the collection contains.
Example:
// Init an empty collection.RandomizedCollection collection = new RandomizedCollection();// Inserts 1 to the collection. Returns true as the collection did not contain 1.collection.insert(1);// Inserts another 1 to the collection. Returns false as the collection contained 1. Collection now contains [1,1].collection.insert(1);// Inserts 2 to the collection, returns true. Collection now contains [1,1,2].collection.insert(2);// getRandom should return 1 with the probability 2/3, and returns 2 with the probability 1/3.collection.getRandom();// Removes 1 from the collection, returns true. Collection now contains [1,2].collection.remove(1);// getRandom should return 1 and 2 both equally likely.collection.getRandom();
因为需要o(1) 时间复杂度实现getRandom() 所以需要ArrayList 另外insert和remove也要是o(1),所以需要HashMap
代码如下:
public class RandomizedCollection {//首先 ArrayList删除最后一个元素的时间复杂度是o(1) 具体参见jdk源码 ArrayList<Integer> list; HashMap<Integer,ArrayList<Integer>> map; Random ran=new Random(); /** Initialize your data structure here. */ public RandomizedCollection() { list=new ArrayList<Integer>(); map=new HashMap<Integer,ArrayList<Integer>>(); } /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */ public boolean insert(int val) { list.add(val); if(!map.containsKey(val)){ map.put(val,new ArrayList<Integer>()); } map.get(val).add(list.size()-1); return true; } /** 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; ArrayList<Integer> mapList=map.get(val); int pos=mapList.remove(mapList.size()-1); if(mapList.isEmpty()) map.remove(val); if(pos!=list.size()-1){ Integer temp=list.get(list.size()-1); list.set(pos,temp); map.get(temp).remove(new Integer(list.size()-1)); map.get(temp).add(pos); } list.remove(list.size()-1); return true; } /** Get a random element from the collection. */ public int getRandom() { return list.get(ran.nextInt(list.size())); }}/** * Your RandomizedCollection object will be instantiated and called as such: * RandomizedCollection obj = new RandomizedCollection(); * boolean param_1 = obj.insert(val); * boolean param_2 = obj.remove(val); * int param_3 = obj.getRandom(); */
之前写的代码不不符合条件的,getRandom不是o(1)。
public class RandomizedCollection {Random random=new Random();HashMap<Integer,Integer> map;int size; /** Initialize your data structure here. */ public RandomizedCollection() { map=new HashMap<Integer,Integer>(); size=0; } /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */ public boolean insert(int val) { size++; if(!map.containsKey(val)){ map.put(val, 1); return true; }else{ map.put(val, map.get(val)+1); return false; } } /** 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; else{ Integer a=map.get(val); if(a<=1) map.remove(val); else{ map.put(val, a-1); } size--; }return true; } /** Get a random element from the collection. */ public int getRandom() { int ran=random.nextInt(size); int i=-1; for(Integer a:map.keySet()){ int times=map.get(a); if(ran>i&&ran<=i+times){ return a; } i+=times; } return -1; }}/** * Your RandomizedCollection object will be instantiated and called as such: * RandomizedCollection obj = new RandomizedCollection(); * boolean param_1 = obj.insert(val); * boolean param_2 = obj.remove(val); * int param_3 = obj.getRandom(); */
阅读全文
1 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)
- SVOSLAM
- 位操作-leetcode-405. Convert a Number to Hexadecimal
- Keil 4/C51与Keil 5的融合安装,51系列可在keil 5下编译安装方式
- [bzoj4590][Shoi2015]自动刷题机 二分
- 全球100款大数据工具汇总
- [LeetCode] Insert Delete GetRandom O(1)
- vxworks 用户开发手册 概述
- MariaDB<Access denied for user 'root'@'172.17.11.85' (using password: YES)>
- 内存泄漏以及常见的解决方法
- 第一次用H5编写游戏的体会
- js递归处理数据,并且渲染页面(表格)
- RG_2
- NuttX实时操作系统
- WebService入门介绍