实现RandomizedSet 类:
RandomizedSet() 初始化 RandomizedSet 对象
bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。
**解题思路:**本题使用哈希表完成,相当于学习哈希表的构建以及一系列的操作
class RandomizedSet {
List<Integer> nums;
Map<Integer,Integer> map;
Random random;
public RandomizedSet() { //初始化元素函数,无返回值
nums=new ArrayList<Integer>(); //使用可变长数组(链表),之后删除数组元素,数组元素也是紧接着的,方便哈希表
map=new HashMap<Integer,Integer>();
random=new Random();
}
public boolean insert(int val) {
if(map.containsKey(val)){ //containsKey函数可用于查找哈希表中是否存在该元素
return false;
}
int index =nums.size();
nums.add(val); //在链表中存入该数据
map.put(val,index); //在哈希表中存入该数据,以及该数据在表中的下标index
return true;
}
public boolean remove(int val) {
if(!map.containsKey(val)){
return false;
}
//总体思路:用链表最后一个元素覆盖要删除的元素,然后把链表最后一个元素删掉,更新哈希表中的数据
int index=map.get(val);//获取需要删除元素
int last=nums.get(nums.size()-1); //获取最后一个元素
nums.set(index,last); //将最后一个元素覆盖需要删除元素上
map.put(last,index); //把替换后的元素和它的新下标一起存入哈希表
nums.remove(nums.size()-1); //删除最后一个元素
map.remove(val); //删除哈希表中的元素
return true;
}
public int getRandom() {
int randomIndex = random.nextInt(nums.size()); //生成[0,size())的随机数
return nums.get(randomIndex);
}
}