Leetcode---Insert Delete GetRandom O(1)--兩種解
阿新 • • 發佈:2018-12-30
Insert Delete GetRandom O(1)
題目連結:Insert Delete GetRandom O(1)
思路:
- 本題和JAVA中的set集合中的插入刪除極為相似,所以最簡便的方法是使用set集合進行模擬,插入刪除不用修改,在返回隨機數時,由於set集合不能夠返回指定位置的值,所以要對其進行轉換,可以將set集合轉換為ArrayList,然後再返回隨機位置的值。
- 這種方法的缺點是執行時間太長,主要是消耗在set集合轉化為list集合返回隨機數時。提交僅擊敗7%
- 第二種方法是:定義一個Map和一個List,map的key儲存插入的值,value儲存插入的順序,List儲存插入的資料,目的是刪除時,能讓map和下標之間重新建立正確的對映,因為我們後面取隨機數時需要用到下標,所以下標不應該產生跳躍,最繞人的就是刪除,插入都是按順序插入,沒有好解釋的,刪除時:首先需要O(1)複雜度,所以不能遍歷list,就需要先將最後一個值覆蓋待刪除的值,然後只刪除最後一個值即可,由於位置調換,所以map中的對應key值的val也需要更新,程式碼如下。
解法一:
public class RandomizedSet{
Set<Integer> set = null;
/** Initialize your data structure here. */
public RandomizedSet() {
set = new HashSet<Integer>();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
return set.add(val);
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
return set.remove(val);
}
/** Get a random element from the set. */
public int getRandom() {
int length = set.size();
List <Integer> list = new ArrayList<Integer>(set);
return list.get((int) (Math.random()*length));
}
}
解法二:
public class RandomizedSet{
Map<Integer,Integer> map = null;
List<Integer> list = null;
int size = 0;
/** Initialize your data structure here. */
public RandomizedSet() {
map = new HashMap<Integer,Integer>();
list = new ArrayList<Integer>();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if(map.containsKey(val)) {
return false;
}else {
list.add(size,val);
map.put(val, size++);
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;
}else {
int index = map.get(val);
list.set(index,list.get(size-1));
map.put(list.get(index),index);
size--;
map.remove(val);
}
return true;
}
public int getRandom() {
// System.out.println(list.size());
return list.get((int) (Math.random()*size));
}
}