Insert Delete GetRandom O(1)

来源:互联网 发布:诸葛诞 知乎 编辑:程序博客网 时间:2024/04/29 13:32

Design a data structure that supports all following operations in averageO(1) time.

  1. insert(val): Inserts an item val to the set if not already present.
  2. remove(val): Removes an item val from the set if present.
  3. 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