1. 程式人生 > >Leetcode---Insert Delete GetRandom O(1)--兩種解

Leetcode---Insert Delete GetRandom O(1)--兩種解

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));
    }
}