2026/5/21
这题确实把我难住了,看了题解才觉得妙啊。
O(1)复杂度的插入就是插入数组最后
O(1)复杂度的删除就是用到哈希表unordered_map来存数组元素以及数组下标。
如何根据value来查找数组下标? 答:键值对中,<value, 数组下标>
cpp
class RandomizedSet {
private:
vector <int> v;
unordered_map<int, int> mp;
public:
RandomizedSet() {
srand((unsigned)time(NULL));
}
//数据插入到vector,同时保存下标
bool insert(int val) {
if(mp.find(val) == mp.end()){
v.push_back(val);
mp.insert({val, v.size()-1});
return true;
}
else{
return false;
}
}
//哈希表用来找元素的下标,删除后用最后一个元素来补齐
bool remove(int val) {
if(mp.find(val) == mp.end())
return false;
int index = mp[val];
mp.erase(val);
v[index] = v[v.size()-1]; //用最后一个元素来补齐
mp[v[index]] = index; //放回哈希表
v.pop_back(); //删除最后一个元素
return true;
}
int getRandom() {
return v[rand() % v.size()];
}
};
*/
这个代码提交不能通过全部样例!原因就在remove函数中。如果只有一个元素时,会导致该元素又被重新添加到数组中。
改成这样就对了。
cpp
v[index] = v[v.size()-1]; //用最后一个元素来补齐
mp[v[index]] = index; //放回哈希表
v.pop_back(); //删除最后一个元素
mp.erase(val); //哈希表删除要在放回之后,否则只有一个元素的情况会被重新放入
2026/5/18
274. H 指数

一开始看了提示使用排序后取中位数,通过37 / 83 个通过的测试用例。
这题也有点难,难在怎么想到用倒序来统计次数。
可以去题解区看大佬的特别解法。
cpp
class Solution {
public:
int hIndex(vector<int>& citations) {
int n = citations.size();
sort(citations.begin(), citations.end(), greater<int>());
int h = 0;
for(auto e : citations){
if(e > h){
h++;
}
}
return h;
}
};


