You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.0 KiB

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