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.
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();

最先想到是用double LinkedList+Map, 没必要,arraylist+map就够了;另外取random的方法还有,rand.nextInt(int n) returns an integer in the range [0, n)

java.util.Random rand = new java.util.Random();

return nums.get( rand.nextInt(nums.size()) );

 public class RandomizedSet {
HashMap<Integer, Integer> map;
ArrayList<Integer> arr; /** Initialize your data structure here. */
public RandomizedSet() {
map = new HashMap<Integer, Integer>();
arr = 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 (map.containsKey(val)) return false;
arr.add(val);
map.put(val, arr.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 (!map.containsKey(val)) return false;
int lastItem = arr.get(arr.size()-1);
if (val != lastItem) {
int index = map.get(val);
arr.set(index, lastItem);
map.put(lastItem, index);
}
arr.remove(arr.size()-1);
map.remove(val);
return true;
} /** Get a random element from the set. */
public int getRandom() {
return arr.get((int)(Math.random()*arr.size()));
}
} /**
* 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();
*/
 
 

最新文章

  1. Facebook Paper使用的第三方库
  2. [Flex] ButtonBar系列——arrowKeysWrapFocus属性如果为 true,则使用箭头键在组件内导航时,如果击中某一端则将折回。
  3. Codeforces Round #190 (Div. 2) 水果俩水题
  4. Objective-C MRC多个对象相互引用的内存管理
  5. ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 错误分析
  6. Ubuntu嵌入式开发环境配置问题集锦(不断更新)
  7. 基于Servlet、JSP、JDBC、MySQL的一个简单的用户注冊模块(附完整源代码)
  8. Effective C++之‘宁以pass-by-reference-to-const替换pass-by-value’
  9. JavaScript原型模式-理解对象
  10. 20175221 2018-2019-2 《Java程序设计》第二周学习总结
  11. 位运算练习:将整数A转换为B,需要改变多少个bit位
  12. App专项测试之弱网测试
  13. 【UML】NO.53.EBook.6.UML.2.001-【Thinking In UML 大象 第二版】- 概述
  14. 3. Go语言基本类型
  15. Sep 15th 2018
  16. Ocelot——初识基于.Net Core的API网关
  17. 随手记录一下 Vue 下来框搜索 select2 封装成vue
  18. POJ-1959 Darts
  19. 通过ctrl+r快速启动程序
  20. Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记

热门文章

  1. ip sevices
  2. apache磁盘缓存配置
  3. Python For Data Analysis -- NumPy
  4. 七 mybatis的延迟加载
  5. MySQL主从架构之Master-Master互为主备
  6. mysql 权限篇
  7. spring简单事务管理器
  8. 理解tornado
  9. C#中String 和string 的区别
  10. 使用多种客户端消费WCF RestFul服务(一)——服务端