首页 > 编程语言 >leetcode274 H指数 —— 排序后遍历/差分 c++

leetcode274 H指数 —— 排序后遍历/差分 c++

时间:2023-10-16 22:55:06浏览次数:68  
标签:cnt 遍历 return int counter c++ leetcode274 citations 排序

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数

根据维基百科上 h 指数的定义h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次。如果 h 有多种可能的值,h 指数 是其中最大的那个。

 

示例 1:

输入:citations = [3,0,6,1,5]
输出:3 
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
     由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3

示例 2:

输入:citations = [1,3,1]
输出:1

 

提示:

  • n == citations.length
  • 1 <= n <= 5000
  • 0 <= citations[i] <= 1000

最容易理解的——排序后遍历

先对原数组进行排序,我们要找最大值的h就是要满足大于等于h的数大于等于h,所以排序之后我们可以知道大于每个数的数有多少,进行查找最大值即可

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

    }
};

  

稍微优化——遍历改成二分搜索

class Solution {
public:
    int hIndex(vector<int>& citations) {
        size_t n = citations.size();
        sort(citations.begin(), citations.end());
        int low = 0, high = n - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (citations[mid] >= n - mid) high = mid - 1;
            else low = mid + 1;
        }
        return n - low;
    }
};

  

差分数组解法(计数排序)

差分数组讲解可参考【算法】排序算法之计数排序 - 知乎 (zhihu.com)

这里因为h<=n,所以大于n的数按n算就行,cnt数组大小n+1

C++

class Solution {
public:
    int hIndex(vector<int>& citations) {
        //计数排序
        int n=citations.size();
        vector<int> counter(n+1) ;//因为h<=n,所以>n的值都存入counter[n]
        for(int i=0;i<n;i++) {
            if(citations[i]>=n) counter[n]++;
            else counter[citations[i]]++;
        }

        int cnt=0;//cnt记录大于i (即citations[某个值])的值个数
        for(int i=n;i>=0;i--) {//从大到小遍历
            cnt+=counter[i];
            if(cnt>=i) {
                //如果大于i的数个数大于i,那么h=i
                return i;
            }
        }
        return 0;

    }
};

  

python:

class Solution:
    def hIndex(self, citations: List[int]) -> int:
        n=len(citations)
        counter=[0]*(n+1)
        for i in citations:
            if i >= n :
                counter[n]+=1
            else :
                counter[i]+=1
        
        cnt=0
        for i in range(n,-1,-1) :
            cnt+=counter[i]
            if cnt>=i:
                return i
        return 0

 

标签:cnt,遍历,return,int,counter,c++,leetcode274,citations,排序
From: https://www.cnblogs.com/ricenoodle/p/17768631.html

相关文章

  • 2——of C++ class relative
    C++类C++和java都是面向对象的语言,所以类的语法上看起来相似,但也有些区别,比如访问控制符的书写规范。除此之外,在访问控制权限,静态static等内容也有很大区别1.访问控制权限访问控制符//不加的默认私有classplayer{intx,y;intspeed;voidmove(inta,intb){......
  • C++11手写线程池1
    线程池结构  任务队列结构体 保存一个回调函数指针和一个,参数指针 实现任务队列 为了多个生产者多个消费者取东西混乱的避免要加互斥锁线程池threadpool类要实现的初始化一个线城池参数是最小数和最大数   malloc和new的区别new要调用该类的构......
  • C++接入redis
    项目地址https://github.com/sewenew/redis-plus-plushttps://github.com/redis/hiredis#1、编译安装hiredis项目wgethttps://github.com/redis/hiredis/archive/refs/tags/v1.2.0.tar.gzcdhiredis#编译安装make&&makePREFIX=安装到指定目录install#2、编译......
  • C++的简单语法
    ​C++库里面的一些基础函数以及迭代器的使用:迭代器:首先,可以将迭代器简单地从方向和限制简单地分为四类:1.正向   intmain(){ strings1="hello"; s1+=""; s1+="world"; cout<<s1<<endl; string::iteratorit1=s1.begin();//在这里,s1.begin()代表......
  • linux c++程序使用MD5
    为避免找到的开源md5算法有坑,一般直接用openssl自带的MD5相关函数实现;一般系统已默认安装openssl,没装的话直接指令安装ubuntusudoapt-getinstalllibssl-devcentossudodnfinstallopenssl-devel示例代码#include<openssl/md5.h>unsignedcharmd5[MD5_DIGEST_LENGT......
  • 警惕 C++ 中的隐式类型转换
    今天文章的主题灵感来自客户的一个问题:我在研究一个代码中的栈溢出问题。为了减小栈帧的大小,我尽可能多地删除了局部变量,但仍有很多栈空间无法解释。除了局部变量、参数、保存的寄存器和返回地址之外,栈上还有什么其他的东西呢?我的回答是,嗯,还有结构化(SEH)的异常处理信息,但这通常不......
  • Qt/C++编写物联网组件/支持modbus/rtu/tcp/udp/websocket/mqtt/多线程采集
    一、功能特点支持多种协议,包括Modbus_Rtu_Com/Modbus_Rtu_Tcp/Modbus_Rtu_Udp/Modbus_Rtu_Web/Modbus_Tcp/Modbus_Udp/Modbus_Web等,其中web指websocket。支持多种采集通讯方式,包括串口和网络等,可自由拓展其他方式。自定义采集间隔(精确到毫秒)和超时次数,超时后自动将离线的文件......
  • UE4 C++关联蓝图界面(仅显示)
    使用的自带第三人称c++模板,UE4.27实现教程参考:UE5虚幻引擎C++【第六期】实现UMG控件_哔哩哔哩_bilibili1.创建一个蓝图界面控件,设置好布局2.找到项目代码xx(项目名称).build.cs文件1)添加UMG及后续部分,使得可以调用蓝图模块相关内容PublicDependencyModuleNames.AddRange(news......
  • VSCode 配置C++环境
    MinGW肯定要装的。复制json这篇就够了,但终端会闪掉:VsCode安装和配置c/c++环境(超完整,小白专用)_vscodec++环境-CSDN博客这篇文章配终端:VSCode中C/CPP的完美配置(完成环境搭建、解决终端自动闪退、解决无法调试)-知乎(zhihu.com)......
  • C++学习笔记Day1
    有关const的一些事1.const对象必须初始化,因为const对象一旦创建,其值不能再被改变。2.const对象是常量,因此可以赋予其字面值。3.普通变量默认支持多文件下共享,而const默认不支持,需要在定义和声明是都加上关键字extern才能在多个文件中使用。4.所谓“常量引用”指的是“对const......