380. O(1) 時間插入、刪除和獲取隨機元素
阿新 • • 發佈:2022-02-23
實現RandomizedSet 類:
RandomizedSet() 初始化 RandomizedSet 物件
bool insert(int val) 當元素 val 不存在時,向集合中插入該項,並返回 true ;否則,返回 false 。
bool remove(int val) 當元素 val 存在時,從集合中移除該項,並返回 true ;否則,返回 false 。
int getRandom() 隨機返回現有集合中的一項(測試用例保證呼叫此方法時集合中至少存在一個元素)。每個元素應該有 相同的概率 被返回。
你必須實現類的所有函式,並滿足每個函式的 平均 時間複雜度為 O(1) 。
來源:力扣(LeetCode)
連結: https://leetcode-cn.com/problems/insert-delete-getrandom-o1
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
心之所向,素履以往 生如逆旅,一葦以航import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class RandomizedSet { private Map<Integer, Integer> indexMap; private int size; private List<Integer> nums; public RandomizedSet() { indexMap = new HashMap<>(); size = 0; nums = new ArrayList<>(); } private void swap(int idx1, int idx2) { int num1 = nums.get(idx1); int num2 = nums.get(idx2); indexMap.put(num1, idx2); indexMap.put(num2, idx1); nums.set(idx1, num2); nums.set(idx2, num1); } public boolean insert(int val) { if (indexMap.containsKey(val)) { return false; } indexMap.put(val, size++); if (nums.size() >= size) { nums.set(size - 1, val); } else { nums.add(val); } return true; } public boolean remove(int val) { if (!indexMap.containsKey(val)) { return false; } int idx1 = indexMap.get(val); int idx2 = size - 1; swap(idx1, idx2); indexMap.remove(val); nums.remove(--size) return true; } public int getRandom() { int index = (int) (Math.random() * size); return nums.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(); */