1.插入
如果存在,则返回false;
如果不存在,那么就在list中插入,在map中记录它的索引,值为key,索引为value
2.删除
如果不存在,返回false;
如果存在,首先在map中找到索引位置index,再与list中的最后一个元素交换位置(将最后一个元素放入index),然后修改map中的记录。最后删除最后一个元素和map中的要删除元素的记录即可。
注意:1.因为list不能根据值找索引,所以需要map来记录索引
2.删除的时候如果原地删除,会导致其他的元素的索引值都会发生变化。所以需要和最后一个元素交换
3.获取随机值
在数组长度范围内获取随机值
class RandomizedSet {
List<Integer> list;
Random random;
Map<Integer,Integer> map;
public RandomizedSet() {
list = new ArrayList<>();
random = new Random();
map = new HashMap<>();
}
public boolean insert(int val) {
if (!list.contains(val)) {
list.add(val);
int value = list.size()-1;
map.put(val,value);
return true;
}else {
return false;
}
}
public boolean remove(int val) {
if (list.contains(val)) {
int index = map.get(val);
int last = list.get(list.size() - 1);
map.put(last,index);
list.set(index,last);
list.remove(list.size() - 1);
map.remove(val);
return true;
}else {
return false;
}
}
public int getRandom() {
int i = random.nextInt( list.size());
int result = list.get(i);
return result;
}
}
/**
* 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();
*/