380. O(1) 时间插入、删除和获取随机元素
解题思路
1.首先我们梳理一下已有数据结构
1)map 删除、插入是O(1) ,如果需要随机获取,需要将map转换为list,然后可以实现随机获取,但是这样就是常数级操作
2)list 获取、插入是O(1) ,删除特定元素,需要查找到,才可以删除,但是这样就是常数级操作
2.由上面的已有数据结构分析,单一数据结构不太好解决此问题,可以配合用来解决此问题
3.用list来存储数据,map来存储数据与索引的对应关系,当要list进行删除时,将最后一个元素替换对应位置的元素,并且删除最后一个元素
解题遇到的问题
数据结构的合理运用
后续需要总结学习的知识点
map、set、list源码阅读&总结
##解法1
class RandomizedSet {
List<Integer> vaList = null;
Map<Integer, Integer> map = null;
Random random = new Random();
public RandomizedSet() {
vaList = new ArrayList<>();
map = new HashMap<Integer, Integer>();
}
/**
* bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
*/
public boolean insert(int val) {
if (!map.containsKey(val)) {
map.put(val, vaList.size());
vaList.add(vaList.size(), val);
return true;
} else {
return false;
}
}
/**
* bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
*/
public boolean remove(int val) {
if (map.containsKey(val)) {
// 获取val对应的索引值
int index = map.get(val);
int lastElement = vaList.get(vaList.size() - 1);
// 将最后一个值,覆盖当前值,也就是删除了当前值
vaList.set(index, lastElement);
map.put(lastElement, index);
// 移除最后一个值
vaList.remove(vaList.size() - 1);
map.remove(val);
return true;
} else {
return false;
}
}
/**
* int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
*/
public int getRandom() {
return vaList.get(random.nextInt(vaList.size()));
}
}
网友评论