首页 > 其他分享 >LeetCode 面试经典150题---004

LeetCode 面试经典150题---004

时间:2024-04-10 13:23:11浏览次数:24  
标签:150 return val nums int RandomizedSet mid --- 004

#### 274. H 指数

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。
n == citations.length
1 <= n <= 5000
0 <= citations[i] <= 1000
本题题意就是给你一个数组,找到最大的h,使得数组中至少有h个数都大于等于h。考虑到本题的n较小,因此如果使用排序的话复杂度也只是\(nlogn\),不会超时。因此先把数组从小到大排序,可以看出h最大就是数组的长度,因此我们可以从最大值开始判断,i从0开始,如果此时nums[i]>=h,说明至少有h个数都大于等于h,直接输出答案,因为我们是从大到小枚举h。

class Solution {
public:
    int hIndex(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        int h = n;
        for(int i = 0;i < n;i ++ ){
            if(nums[i] >= h) return h;
            else h --;
        }
        return h;
    }
};

本题还可以采用二分,因此h的值只会在1-n,因此我们在1-n之间二分,令mid=l + r + 1 >> 2,如果此时mid满足由mid个数都大于等于mid,我们令左区间l=mid;否则令右区间r=mid - 1。

class Solution {
public:
    int hIndex(vector<int>& nums) {
        int n = nums.size();
        int l = 0, r = n;
        while(l < r){
            int mid = l + r + 1 >> 1;
            if(check(nums, mid)) l = mid;
            else r = mid - 1;
        }
        return l;
    }

    bool check(vector<int> nums, int h){
        int cnt = 0;
        for(int i = 0;i < nums.size();i ++ ){
            if(nums[i] >= h) cnt ++;
        }
        if(cnt >= h) return true;
        return false;
    }

};

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

实现RandomizedSet 类:
RandomizedSet() 初始化 RandomizedSet 对象
bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。
\(-2^{31} <= val <= 2^{31} - 1\)
最多调用 insert、remove 和 getRandom 函数 2 * 105 次
在调用 getRandom 方法时,数据结构中 至少存在一个 元素。

本题就是模拟,直接根据题意一步步操作即可。首先对于插入,定义哈希表用来存储每个插入元素的下标和判断该元素是否存在,再定义一个数组用来存储元素,方便后面输出随机一个元素;对于删除,和插入类似,不过需要删除数组和哈希表的对应元素;对于随机一个元素,直接rand即可。

class RandomizedSet {
public:
    unordered_map<int, int> hash;
    vector<int> arr;
    int cnt = 0;

    RandomizedSet() {

    }
    
    bool insert(int val) {
        auto it = hash.find(val);
        if(it == hash.end()){
            hash[val] = cnt ++;
            arr.push_back(val);
            return true;
        }
        return false;
    }
    
    bool remove(int val) {
        auto it = hash.find(val);
        if(it != hash.end()){
            int item = it->second;
            arr[item] = arr.back();
            hash[arr[item]] = item;
            arr.pop_back();
            cnt --;
            hash.erase(val);
            return true;
        }
        return false;
    }
    
    int getRandom() {
        return arr[rand() % cnt];
    }
};

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet* obj = new RandomizedSet();
 * bool param_1 = obj->insert(val);
 * bool param_2 = obj->remove(val);
 * int param_3 = obj->getRandom();
 */

总结,整体比较简单,就是需要一点小技巧。

标签:150,return,val,nums,int,RandomizedSet,mid,---,004
From: https://www.cnblogs.com/timeac-coder/p/18125817

相关文章

  • 实验一-密码引擎-3-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • javaScript-sort()排序
    在写题的时候要以列表中的某个参数进行排序letlist=[{age:10,name:'x1'},{age:8,name:'x2'},{age:20,name:'x3'},{age:9,name:'x4'},{age:30,name:'x5'},]就用到了list.sort((a,b)=>a.age-b.age)但是我搞不清楚如何来判断是......
  • 5、Hackademic-RTB1(VulnHub)
    Hackademic-RTB1一、nmap扫全端口会爆炸,暂时使用默认先扫描出两个二、web渗透随便看看简单目录爆破/Hackademic_RTB1/根据界面提示,我们可以来到这个目录源码处发现框架再次目录爆破wscan扫描WordPress1.5.1searchsploit/wp-content/plugins/在目录爆破......
  • 2-55. 种子成长过程
    创建CropBase修改CropDataList_SO修改CropManager修改GridMapManager修改Crop修改ItemManager修改EventHandler修改InventoryManager修改GridMapManager修改AnimatorOverride作业完善CropDataList_SO中的其它种子项目相关代码代码仓库:https......
  • 实验一-密码引擎-3-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • GD32F470_GP2Y0A02YK0F 红外激光测距传感器 避障测距20-150cm模块移植
    2.4红外测距传感器GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(positionsensitivedetector)和IRED(infraredemittingdiode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输......
  • MySQL-6.表的高级查询(多表查询、子查询、表复制、合并查询、表外连接)
    6.1 多表查询基于两个或以上表的查询,默认从表1取出一行,与表2的每一行组合,返回的记录数为表1×表2,默认返回的结果为笛卡尔集,需写出正确的WHERE条件进行筛选。多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集。指定显示某个表的列:表.列#显示雇员名,雇员工资及所在......
  • Spring Boot-如何优雅的写单元测试
    SpringBoot-如何优雅的写单元测试[SpringBoot-如何优雅的写单元测试](#SpringBoot-如何优雅的写单元测试)什么是单元测试Mockito介绍Mockito使用@Spy的使用InjectMocks的使用@MockBean的使用@SpyBean的使用方法的校验和断言测试ControllerRunWith使用加......
  • 贪心选讲-几个套路
    凸性CF1428ECarrotsforRabbits给\(n\)个胡萝卜,再\(n-k\)次选出一个胡萝卜切一刀成俩,最小化最后所有胡萝卜平方和.CF1661FTeleporters给定数轴上\(n\)个点和\(m\),要再建立若干点,使得存在一条路径\(a_1\ldotsa_n\)的\(\sum{(a_i-a_{i-1})}^2\lem\)......
  • ORA-01652 无法通过128 (在表空间 TEMP中)扩展temp段
    1,同事说执行sql报错同事在plsql里面执行sql报错,报错信息:ora-01652无法通过128(在表空间TEMP中)扩展temp段,如下图所示: 2,查看报错sql语句Sql比较长,而且无法扩展temp字段,那么基本推断可能有如下2种情况:(1)oracle的temp临时表空间太小了;(2)一个性能非常差的笛卡尔积的带全表扫描......