package 第03期.mca_08; import java.util.HashMap; // 实现RandomizedSet 类: // RandomizedSet() 初始化 RandomizedSet 对象 // bool insert(int val) // 当元素 val 不存在时,向集合中插入该项,并返回 true // 否则,返回 false // bool remove(int val) // 当元素 val 存在时,从集合中移除该项,并返回 true // 否则,返回 false // int getRandom() 随机返回现有集合中的一项 // 每个元素应该有 相同的概率 被返回 // 你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。 // 测试链接 : https://leetcode.cn/problems/insert-delete-getrandom-o1/ public class Code06_InsertDeleteGetRandom { public class RandomizedSet { // v -> i private HashMap keyIndexMap; // i -> v private HashMap indexKeyMap; // 几个数进来了 private int size; public RandomizedSet() { keyIndexMap = new HashMap(); indexKeyMap = new HashMap(); size = 0; } public boolean insert(int val) { if (!keyIndexMap.containsKey(val)) { keyIndexMap.put(val, size); indexKeyMap.put(size++, val); return true; } return false; } public boolean remove(int val) { // 拿最后的位置,填上当前要删掉数字的,洞! if (keyIndexMap.containsKey(val)) { // 删掉 30 7 // size-1位置的数字,填洞 // 查出30在7位置 int deleteIndex = keyIndexMap.get(val); // 最后位置是啥?size - 1 int lastIndex = --size; // x lastKey int lastKey = indexKeyMap.get(lastIndex); keyIndexMap.put(lastKey, deleteIndex); indexKeyMap.put(deleteIndex, lastKey); keyIndexMap.remove(val); indexKeyMap.remove(lastIndex); return true; } return false; } public int getRandom() { if (size == 0) { return -1; } int randomIndex = (int) (Math.random() * size); return indexKeyMap.get(randomIndex); } } }