插入、删除和随机访问都是 O(1) 的容器——leetcode30
插入、删除和随机访问都是 O(1) 的容器
描述
设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构:
insert(val):当元素 val 不存在时返回 true ,并向集合中插入该项,否则返回 false 。
remove(val):当元素 val 存在时返回 true ,并从集合中移除该项,否则返回 false 。
getRandom:随机返回现有集合中的一项。每个元素应该有 相同的概率 被返回。
示例
输入: inputs = ["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
输出: [null, true, false, true, 2, true, false, 2]
题解:List + HashMap
数据结构:
-
LinkedList: 保存数,插入数据和根据下标删除数据的时间复杂度为O(1)
-
HashMap: (num: index), 保存数的下标
实现逻辑:
-
add:list.add(num), map检验元素是否存在
-
remove:用最后一个元素覆盖被删除的元素
class RandomizedSet {
private List<Integer> nums;
private Map<Integer, Integer> map; //val: index
public RandomizedSet() {
nums = new LinkedList<>();
map = new HashMap<>();
}
public boolean insert(int val) {
if(map.containsKey(val)) return false;
nums.add(val);
map.put(val, nums.size() -1);
return true;
}
public boolean remove(int val) {
if(!map.containsKey(val)) return false;
int index = map.get(val);
if(index != nums.size() -1) {
int last = nums.get(nums.size()-1);
nums.set(index, last);
map.put(last, index);
}
map.remove(val);
nums.remove(nums.size()-1);
return true;
}
public int getRandom() {
int index = (int) (Math.random() * nums.size());
return nums.get(index);
}
}