剑指 Offer II 030. 插入、删除和随机访问都是 O(1) 的容器(380. O(1) 时间插入、删除和获取随机元素)
题目:
思路:
【1】本质上就是利用数据结构组合,合理的达成目标,思路大致都一样,着重看的是影响速度和内存的消耗。
代码展示:
//时间21 ms击败86.7% //内存90.2 MB击败54.59% class RandomizedSet { private List<Integer> list; private Map<Integer, Integer> map; private Random random; /** * Initialize your data structure here. */ public RandomizedSet() { list = new ArrayList<>(); map = new HashMap<>(); 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 (map.containsKey(val)) { return false; } // 这里的顺序不能搞错了 map.put(val, list.size()); list.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 (!map.containsKey(val)) { return false; } int position = map.get(val); // 最后一个跟他换位置,然后 map的位置更新一下 map.put(list.get(list.size() - 1), position); map.remove(val); // 换完位置后去掉 list.set(position, list.get(list.size() - 1)); list.remove(list.size() - 1); return true; } /** * Get a random element from the set. */ public int getRandom() { return list.get(random.nextInt(list.size())); } } //时间29 ms击败27.55% //内存85.4 MB击败93.91% class RandomizedSet { private Map<Integer,Integer> map; private List<Integer> list; private int size; public RandomizedSet() { map = new HashMap<>(); list = new ArrayList<>(); size = 0; } public boolean insert(int val) { if(map.containsKey(val)){ return false; }else{ //这里需要用add(index,value)的重载方法,覆盖当前的size位置,这个方法在size == index也可以使用 //不能使用set(index,value)方法,这个方法会在size == index时直接抛异常 list.add(size,val); map.put(val,size); size++; } return true; } public boolean remove(int val) { if(!map.containsKey(val)){ return false; }else{ int oldIndex = map.get(val); int lastVal = list.get(size - 1); list.set(oldIndex,lastVal); map.put(lastVal,oldIndex); map.remove(val); size--; } return true; } public int getRandom() { Random ran = new Random(); return list.get(ran.nextInt(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(); */