1. 程式人生 > >LeetCode - 380. Insert Delete GetRandom O(1) (常數時間插入、刪除和獲取隨機元素)

LeetCode - 380. Insert Delete GetRandom O(1) (常數時間插入、刪除和獲取隨機元素)

LeetCode - 380. Insert Delete GetRandom O(1) (常數時間插入、刪除和獲取隨機元素)


題目連結

題目

在這裡插入圖片描述


HashMap + List 實現

解析:

  • 準備一個HashMap和一個List容器,HashMap存放valindex的對映,List容器中存放val集合;
  • insert(): 將val插入List,並加<val, val在List對應的索引> 放入HashMap
  • remove(): 先獲取要移除的值val
    index,記為removeIndex,然後取List中的最後一個元素,記為lastVal,然後執行valIndexMap.put(lastVal, removeIndex);vals.set(removeIndex, lastVal);也就是將最後一個元素放到要刪除的位置。 最後在兩個容器中移除要刪除的元素即可;
  • getRandom(): 在List中隨機取一個元素即可;

在這裡插入圖片描述

class RandomizedSet {

    private HashMap<Integer, Integer>valIndexMap; // val -> index
    private
ArrayList<Integer> vals; public RandomizedSet() { valIndexMap = new HashMap<>(); vals = new ArrayList<>(); } public boolean insert(int val) { if(valIndexMap.containsKey(val)) return false; valIndexMap.put(val, vals.size());
vals.add(val); return true; } public boolean remove(int val) { if(!valIndexMap.containsKey(val)) // doesn't exit, return false; return false; int removeIndex = valIndexMap.get(val); Integer lastVal = vals.get(vals.size()-1); valIndexMap.put(lastVal, removeIndex); // put the lastVal to the removeIndex position vals.set(removeIndex, lastVal); // update vals valIndexMap.remove(val); vals.remove(vals.size() - 1); return true; } public int getRandom() { if(vals.size() == 0) throw new RuntimeException(); int randomIndex = (int)(Math.random() * vals.size()); return vals.get(randomIndex); } }

兩個HashMap實現

這個和上面那個也是類似的:

  • 通過一個size變數來維護這個容器的容量;
  • 然後要增加一個index -> val的容器,這個就是替代了那個List,可以通過index來獲取val
  • 主要的思想還是通過將最後一個元素(size - 1)放到刪除元素的位置(removeIndex);
class RandomizedSet {

    private HashMap<Integer, Integer>valIndexMap; // val -> index 
    private HashMap<Integer, Integer>indexValMap; // index -> val 
    private int size;
    
    public RandomizedSet() {
        valIndexMap = new HashMap<>();
        indexValMap = new HashMap<>();
        size = 0;
    }
    
    public boolean insert(int val) {
        if(valIndexMap.containsKey(val))
            return false;
        valIndexMap.put(val, size);
        indexValMap.put(size++, val);
        return true;
    }
    
    public boolean remove(int val) {
        if(!valIndexMap.containsKey(val)) // doesn't exit, return false;
            return false;
        int removeIndex = valIndexMap.get(val);  // get the index of deleteVal 
        int lastIndex = --size;             // the last element's index
        
        Integer lastVal = indexValMap.get(lastIndex);
        
        valIndexMap.put(lastVal, removeIndex);  
        indexValMap.put(removeIndex, lastVal);
        
        // remove val and the lastIndex
        valIndexMap.remove(val);
        indexValMap.remove(lastIndex); 
        return true;
    }
    
    public int getRandom() {
        if(size == 0)
            throw new RuntimeException();
        int randomIndex = (int)(Math.random() * size);
        return indexValMap.get(randomIndex);
    }
}