面试经典 150 题 380 274

2026/5/21

380. O(1) 时间插入、删除和获取随机元素


这题确实把我难住了,看了题解才觉得妙啊。

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;
    }
};
相关推荐
瓶中怪5 分钟前
ROS2 机器人软件系统
linux·c++·python·ubuntu·vmware·ros2·机器人软件开发
从零开始的代码生活_26 分钟前
NAT、代理服务与内网穿透详解
linux·服务器·网络·c++·http·智能路由器
aaaameliaaa28 分钟前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
charlie1145141911 小时前
Cinux: 加载第一个内核:从 bootloader 跳进 C++
linux·开发语言·c++·嵌入式
QiLinkOS2 小时前
第三视觉理解徐玉生与他的商业活动(28)
大数据·c++·人工智能·算法·开源协议
星夜夏空992 小时前
C++学习(2) —— 类与对象基础
开发语言·c++·学习
码云数智-大飞3 小时前
从 OC 平滑迁移 Swift 完整方案
职场和发展·蓝桥杯
wabs6663 小时前
关于动态规划【力扣1143.最长公共子序列的思考】
算法·leetcode·动态规划
剑挑星河月3 小时前
54.螺旋矩阵
java·算法·leetcode·矩阵
Robot_Nav3 小时前
MPPI 局部规划器实验设计讲解
人工智能·算法·mppi