双map解法,不要自己去实现哈希表,改结构,哈希表是等概率分布,是大样本的情况下,小样本可不一定满足,你不能保证每个位置都有元素,如果重新随机,那么时间复杂度是不是就不是o1了呢,所以用java自带的map即可
class RandomizedSet {
/** Initialize your data structure here. */
int size;
HashMap<Integer,Integer> keyisbiao,keyisvalue;
public RandomizedSet() {
size=0;
keyisbiao=new HashMap();
keyisvalue=new HashMap();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if(!keyisvalue.containsKey(val)){
keyisvalue.put(val,size);
keyisbiao.put(size++,val);
return true;
}
return false;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
if(keyisvalue.containsKey(val)){
//其实就是保留两个删除两个,保留的分别是删除的num和最后num对应的value,删除的是num对应的value和最后的num
//所以只要找出value对应的num和最后num对应的元素,进行put,然后删除val和最后的num(这俩都是已知的)
int lastvalue=keyisbiao.get(--size);
int xiaobiao=keyisvalue.get(val);//保留的下标
keyisvalue.put(lastvalue,xiaobiao);
keyisbiao.put(xiaobiao,lastvalue);
keyisvalue.remove(val);
keyisbiao.remove(size);
return true;
}
return false;
}
/** Get a random element from the set. */
public int getRandom() {
//生成随机数,Math.random生成0-1的随机数,乘以size,随机生成0-size-1之间的整数
int index=(int)(Math.random()*size);
return keyisbiao.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();
*/