这道题的要求是O(1)
插入和删除元素,hashmap可以达到O(1),随机访问元素,list可以达到O(1)。
所以维护一个hashmap和list,hashmap中存放元素-listindex的数据,list中存放真实的数据。
插入元素,将元素加入最后一位,同时将信息加入map中。
删除元素,将最后一位的元素与要删除的元素替换,并且同时更新map中的信息,这样list在下次插入的时候还会插入到最后一个。
随机访问元素 直接随机数访问数组即可。
class RandomizedSet {
private HashMap<Integer,Integer> map; // 保存元素在 list 中的位置
private ArrayList<Integer> list; // 保存元素的list
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) {
//hashmap存放元素和索引
//插入的时候,如果hashmap没找到,那就将元素存放到最后一个位置,加入hashmap
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 loc = list.indexOf(val);
int lastval = list.get(list.size()-1);
list.set(loc,lastval);//将最后一个元素放在要删除元素的位置上。
list.remove(list.size()-1);//删掉最后一个元素
map.put(val,loc);
map.remove(val);
return true;
}
/** Get a random element from the set. */
public int getRandom() {
return list.get(random.nextInt(list.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();
*/