QUESTION:
Design a data structure that supports all following operations in average O(1) time.
- insert(val): Inserts an item val to the set if not already present.
- remove(val): Removes an item val from the set if present.
- getRandom: Returns a random element from current set of elements. Each element must have the same 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 2 is the only number in the set, getRandom always return 2. randomSet.getRandom();
#### EXPLANATION:
看完题目后,我的第一个想法是用链表来做,这样的话可以通过一次for循环来找到插入和remove的位置,同时记录下对应的size,这样直接用随机函数就能取到对应的位置了。
关键点还是利用了自己去进行一个排序,这样在插入的时候就很容易去判断是否有重复的。
思路:
1. 创建一个head,用来标记链表的头部
2. 当插入的时候,按照顺序插入,如果已经有了该节点,那么就返回false
3. 删除的时候,也是同样的方式,进行查找,然后删除节点
4. random就是对size进行寻找
#### SOLUTION:
```java
class RandomizedSet {
ListNode head;
int size = 0;
Random r;
/** Initialize your data structure here. */
public RandomizedSet() {
head = new ListNode(Integer.MIN_VALUE);
size = 0;
r = new Random();
}
public void print(){
while (head!=null){
System.out.print(head.val+"->");
head = head.next;
}
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
ListNode tmp = head;
while (tmp.next!=null && tmp.next.val < val){
tmp = tmp.next;
}
if(tmp.next!= null && tmp.next.val == val) return false;
ListNode node = new ListNode(val);
node.next = tmp.next;
tmp.next = node;
size++;
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
ListNode tmp = head;
ListNode pre = tmp;
while (tmp!=null){
if(tmp.val == val) break;
pre = tmp;
tmp = tmp.next;
}
if(tmp == null || tmp.val!=val) return false;
pre.next = tmp.next;
size--;
return true;
}
/** Get a random element from the set. */
public int getRandom() {
int random = r.nextInt(size);
int idx = 0;
ListNode tmp = head.next;
while (idx!=random){
tmp = tmp.next;
idx++;
}
System.out.println(tmp.val);
return tmp.val;
}
}