题目1 : setAll功能的哈希表

cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int cnt = 0;
int setAllValue = 0;
int setAllTimes = -1;
unordered_map<int, pair<int, int>> map;
void put(int key, int val) {
if (map.find(key) != map.end()) {
// 如果已经存在,则更新值和次数
map[key].first = val;
map[key].second = cnt++;
} else {
// 如果不存在,则插入新键值对
map[key] = {val, cnt++};
}
}
int get(int key) {
if (map.find(key) == map.end()) {
return -1;
}
auto& value = map[key];
if (value.second > setAllTimes) {
return value.first;
} else {
return setAllValue;
}
}
void setAll(int val) {
setAllValue = val;
setAllTimes = cnt++;
}
int main() {
put(1, 1);
cout << get(1) << endl; // 输出: 1
setAll(2);
cout << get(1) << endl; // 输出: 2
return 0;
}
题目2 : 实现LRU结构
LRU结构就是,

可以使用HashMap和双向链表来实现,
题目3 : 插入、删除和获取随机元素O(1)时间的结构
题目4 : 插入、删除和获取随机元素O(1)时间且允许有重复数字的结构

cpp
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
class InsertDeleteRandom {
public:
bool insert(int val) {
// 数组中插入元素
vec.push_back(val);
// 记录下标
int idx = vec.size() - 1;
unordered_set<int>& set = map[val];
set.insert(idx);
return set.size() == 1;
}
bool remove(int val) {
if (map.find(val) == map.end()) {
return false;
}
unordered_set<int>& valSet = map[val];
int valueIdx = *valSet.begin();
int endValue = vec.back();
if (val == endValue) {
// 如果要删除的值刚好在数组末尾
valSet.erase(vec.size() - 1);
} else {
unordered_set<int>& endValueSet = map[endValue];
vec[valueIdx] = endValue; // 将数组末尾的值移动到要删除的位置
endValueSet.insert(valueIdx); // 更新数组末尾值的下标
endValueSet.erase(vec.size() - 1); // 删除数组末尾值的下标
valSet.erase(valueIdx); // 删除要删除的值在数组中的下标
}
vec.pop_back(); // 删除数组末尾的值
if (valSet.empty()) {
map.erase(val); // 如果要删除的值在数组中不存在,则从哈希表中移除
}
return true;
}
int getRandom() {
int randomIdx = rand() % vec.size();
return vec[randomIdx];
}
// 打印数组
void print() const {
cout << "print vec: ";
for (int num : vec) {
cout << num << " ";
}
cout << endl;
}
private:
unordered_map<int, unordered_set<int>> map;
vector<int> vec;
};
int main() {
srand((unsigned int)time(nullptr));
InsertDeleteRandom idr;
cout << boolalpha;
cout << idr.insert(1) << endl;
cout << idr.insert(1) << endl;
cout << idr.insert(2) << endl;
cout << idr.remove(3) << endl;
idr.print();
cout << idr.insert(4) << endl;
cout << idr.remove(1) << endl;
idr.print();
cout << idr.getRandom() << endl;
cout << idr.getRandom() << endl;
return 0;
}
题目5 : 快速获得数据流的中位数的结构
当大根堆为空或者数据小于等于大根堆的堆顶的值时,加入大根堆,其余数据加入小根堆,当大小根堆的元素数量差大于1时,就需要调整,始终保持大小根堆的元素差值小于等于1。

cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class FindMedian {
public:
void addNum(int num) {
if (maxHeap.empty() || num <= maxHeap.top()) {
maxHeap.push(num);
} else {
minHeap.push(num);
}
balance();
}
double findMedian() {
if (maxHeap.size() == minHeap.size()) {
return (maxHeap.top() + minHeap.top()) / 2.0;
} else {
return maxHeap.size() > minHeap.size() ? maxHeap.top() : minHeap.top();
}
}
private:
priority_queue<int, vector<int>, less<int>> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;
void balance() {
if (maxHeap.size() >= minHeap.size() + 2) {
minHeap.push(maxHeap.top());
maxHeap.pop();
} else if (minHeap.size() >= maxHeap.size() + 2) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
}
};
题目6 : 最大频率栈

题目7 : 全O(1)的数据结构
