力扣刷题

2023-05-16

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

H指数

  • 题目介绍
  • 一、实现思路
      • 方法一:排序
          • 分析
          • 复杂度分析
      • 方法二:计数
          • 分析
          • 算法
        • 复杂度分析
  • 二、使用算法
    • 1.python实现
    • 2.C++实现
    • 3.java实现
  • 总结


地址:https://leetcode-cn.com/problems/h-index-ii/

开发语言:python或C++

题目:H 指数

难度: 中等

题目介绍

序号:274. H 指数
给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数 不超过 h 次。)

例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。

示例:

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

提示:如果 h 有多种可能的值,h 指数是其中最大的那个。


序号:275. H 指数 II
给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照 升序排列 。编写一个方法,计算出研究者的 h 指数。

h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)"

示例:

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

说明:

如果 h 有多有种可能的值 ,h 指数是其中最大的那个。

一、实现思路

方法一:排序

分析

我们想象一个直方图,其中 x 轴表示文章,y 轴表示每篇文章的引用次数。如果将这些文章按照引用次数降序排序并在直方图上进行表示,那么直方图上的最大的正方形的边长 h就是我们所要求的 h。
在这里插入图片描述
在这里插入图片描述

复杂度分析

时间复杂度:O(n\log n)O(nlogn),即为排序的时间复杂度。
空间复杂度:O(1)O(1)。大部分语言的内置 sort 函数使用堆排序,它只需要 O(1)O(1) 的额外空间。

方法二:计数

分析

基于比较的排序算法存在时间复杂度下界 O(n\log n)O(nlogn),如果要得到时间复杂度更低的算法,就必须考虑不基于比较的排序。

算法

方法一中,我们通过降序排序得到了 h 指数,然而,所有基于比较的排序算法,例如堆排序,合并排序和快速排序,都存在时间复杂度下界 O(n\log n)O(nlogn)。要得到时间复杂度更低的算法. 可以考虑最常用的不基于比较的排序,计数排序。

然而,论文的引用次数可能会非常多,这个数值很可能会超过论文的总数 nn,因此使用计数排序是非常不合算的(会超出空间限制)。在这道题中,我们可以通过一个不难发现的结论来让计数排序变得有用,即:

如果一篇文章的引用次数超过论文的总数 n,那么将它的引用次数降低为 n 也不会改变 h 指数的值。

由于 h指数一定小于等于 n,因此这样做是正确的。在直方图中,将所有超过 y轴值大于 n 的变为n 等价于去掉y>n 的整个区域。
在这里插入图片描述
从直方图中可以更明显地看出结论的正确性,将 y>n 的区域去除,并不会影响到最大的正方形,也就不会影响到 h指数。

我们用一个例子来说明如何使用计数排序得到 hh 指数。首先,引用次数如下所示:
在这里插入图片描述

将所有大于 n=5的引用次数变为 n,得到
在这里插入图片描述
计数排序得到的结果如下:
在这里插入图片描述
在这里插入图片描述

public class Solution {
    public int hIndex(int[] citations) {
        int n = citations.length;
        int[] papers = new int[n + 1];
        // 计数
        for (int c: citations)
            papers[Math.min(n, c)]++;
        // 找出最大的 k
        int k = n;
        for (int s = papers[n]; k > s; s += papers[k])
            k--;
        return k;
    }
}

复杂度分析

时间复杂度:O(n)O(n)。在计数时,我们仅需要遍历 \mathrm{citations}citations 数组一次,因此时间复杂度为 O(n)O(n)。在找出最大的 k 时,我们最多需要遍历计数的数组一次,而计数的数组的长度为 O(n)O(n),因此这一步的时间复杂度为 O(n)O(n),即总的时间复杂度为 O(n)O(n)。
空间复杂度:O(n)O(n)。我们需要使用 O(n)O(n) 的空间来存放计数的结果

作者:LeetCode
链接:https://leetcode-cn.com/problems/h-index/solution/hzhi-shu-by-leetcode/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者:LeetCode
链接:https://leetcode-cn.com/problems/h-index/solution/hzhi-shu-by-leetcode/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、使用算法

1.python实现

代码如下(示例):

class Solution(object):
    def hIndex(self, citations):
        """
        :type citations: List[int]
        :rtype: int
        """
        citations.sort(reverse = True)  #逆序,从大到小排序
        i = 0
        n = len(citations)
        while(i<n and citations[i]>i):
            i+=1
        return i

注意!!!!!!!!!!!
#逆序会多花费时间,所以还是选择顺序排列,即从小到大排序

class Solution(object):
    def hIndex(self, citations):
        """
        :type citations: List[int]
        :rtype: int
        """
        citations.sort()  #逆序会多花费时间,所以还是选择顺序排列,即从小到大排序
        i = 0
        n = len(citations)
        while(i<n and citations[n-1-i]>i):
            i+=1
        return i

2.C++实现

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

这里sort()中的参数加上 greater() 运行结果不对

3.java实现

代码如下(示例):

class Solution {
    public int hIndex(int[] citations) {
        Arrays.sort(citations);
        int i = 0;
        while (i < citations.length && citations[citations.length - 1 - i] > i) {
            i++;
        }
        return i;

    }
}

总结

提示:这里对易错点进行总结:
1、对于程序中多次用到的东西,可以先算出来
2、排序时能用顺序从小到大就用顺序,逆序会增加时间
3、注意不同语言的排序函数不同,函数中的参数也不同
4、注意这里的C++排序中不能加greater()
可以对比下一篇文章
5、多个判断条件时可以用while实现,比for运行时间短

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣刷题 的相关文章

  • TX2安装Psensor

    TX2安装Psensor过程 笔记备份 STEP1 xff1a 命令 xff1a sudo apt span class token operator span span class token keyword get span insta
  • ubuntu系统unzip解压缩命令

    转载链接unzip使用 1 功能作用 xff1a 解压缩zip文件 2 位置 xff1a usr bin unzip 3 格式用法 xff1a unzip Z opts modifiers file zip list x xlist d e
  • windows安装虚拟机

    1 官网下载VMware 2 安装 xff08 只修改了安装位置 xff0c 其余默认 xff09 3 新建虚拟机 1 xff09 进入目录D Software VMware VMware Workstation xff0c 双击 vmwa
  • 2019中科大数学考研复试题(回忆版)

    2019中科大数学考研复试题 xff08 回忆版 xff09 实变函数 1 平面上横坐标或纵坐标为有理数的点集测度为零 2 f n f n
  • WGS84与大地2000坐标转换(Java,C#,Dart)

    一 坐标转换的必要性 平面坐标在道路测绘 隧道测量 农业建筑业等室外勘测等方面有着广泛的应用 各行业基本都会涉及到移动端测量之后不能满足屏幕坐标 所以需要经纬度的转换 移动端勘测结果都是WGS84坐标或者GCJ 02格式坐标 而实际工程项目
  • 玩转python(一)——微信远程控制电脑

    1 综述 这是一个挺有意思的 python 程序 xff0c 基于 itchat 实现微信控制电脑 你可以通过在微信发送命令 xff0c 来拍摄当前电脑的使用者 xff0c 然后图片会发送到你的微信上 甚至你可以发送命令来远程关闭电脑 效果
  • go get 下载包 modules disabled by GO111MODULE=auto

    Go 版本是 1 12 及以下 zshrc bashrc 加入配置source zshrc 启用 Go Modules 功能 export GO111MODULE 61 on 配置 GOPROXY 环境变量 export GOPROXY 6
  • java中final关键字的作用

    final关键字可以用于三个地方 用于修饰类 类属性和类方法 被final关键字修饰的类不能被继承 xff0c 被final关键字修饰的类属性和类方法不能被覆盖 xff08 重写 xff09 xff1b 对于被final关键字修饰的类属性而
  • 【锻体篇-硬件开发】获取精准的电流信号 -- 电路设计与注意事项

    朋友像棉被 xff0c 感到温暖是因为你自己的温度 概述 在嵌入式开发领域 xff0c 一个设计优秀的硬件就像一副健壮的躯体 xff0c 配以聪明的大脑 xff08 软件 xff09 xff0c 就能够发挥出其强大的威力 对于电流信号 xf
  • 【RT-Thread】使用 Finsh 查看线程状态中的 sp 代表什么意思?

    佛说 xff1a 一切有为法 xff0c 如梦幻泡影 xff0c 如露亦如电 xff0c 应作如是观 金刚经 详解 sp 含义 最近使用 RT Thread 的 Finsh 输入 list thread 命令查看线程状态时 xff0c 突然
  • Qt学习:常用数学函数

    C语言中 Qt中 xff0c 都没有以任意为底数的对数函数 xff0c 所以log5 3 以5为底 是没有的 但是可以用logx y 61 ln y ln x 来代替 xff0c 修改代码如下 1 Qt中对数 xff0c 通过自然对数qLn
  • 【好书推荐】-- 《以太网权威指南》(第2版)

    书籍的全部意义是使人善用自己的孤独 匡扶 纳闷集 稍微点题外话 xff0c 最近换了份跟汽车电子相关的工作 xff0c 突然强度就上来了 xff0c 以前5天8小时还能摸鱼的幸福时光还甚是想念 话扯远了 xff0c 回到文章内容 因为最近手
  • 【神器】截图+贴图工具 Snipaste

    生活就好像一大杯 xff0c 一直在续着热水的茶 一天天过下去就像一次次开水 xff0c 到后来越来越淡 xff0c 根本没味道了 匡扶 纳闷集 1 推荐理由 今天介绍的这款神器 xff0c 名唤 Snipaste 毫不夸张地说 xff0c
  • 【好书推荐】第一本无人驾驶技术书

    炮制虽繁必不敢省人工 xff0c 品味虽贵必不敢减物力 xff0c 修合无人见 xff0c 存心有天知 同仁堂古训 推荐理由 智能驾驶行业如火如荼 xff0c 和半导体 xff08 在中国 xff09 元宇宙等新兴行业一样有着醉人的科技元素
  • 【神器】MarkDown-沉浸写作的利器

    最好的销售方法 xff0c 就是真诚地相信你所销售的东西 出售你真正相信的东西感觉很棒 xff0c 而试图出售你不相信的东西 xff0c 感觉很糟糕 Sam Altman 如何成功 1 缘起 话说天下文档格式各有不同 xff0c 富文本格式
  • 【好书推荐】C语言程序设计:现代方法(第二版)

    待到秋来九月八 xff0c 我花开后百花杀 冲天香阵透长安 xff0c 满城尽带黄金甲 唐 黄巢 不第后赋菊 推荐理由 C 语言作为嵌入式开发的必备语言 xff0c 重要性不言而喻 基于此 xff0c 本次推荐的书籍是 C语言程序设计 xf
  • 【好书推荐】网络是怎样连接的

    游山五岳东道主 xff0c 拥书百城南面王 万人丛中一握手 xff0c 使我衣袖三年香 龚自珍 投宋于庭翔凤 xff08 最后两句 xff0c 我愿称之为目前所见最强 夸夸 词 xff09 推荐理由 今天推荐的这本书想必很多搞计算机网络的人
  • 【好书推荐】程序是怎样跑起来的

    一位护士问临终的病人 xff0c 他们有什么遗憾 这个护士后来总结了 5 个最常见的回答 xff1a 不要忽视你的梦想 xff0c 不要工作太久 xff0c 说出你内心所想 xff0c 结交朋友 xff0c 要开心 推荐理由 之前有推荐过两
  • 【好书推荐】图解TCP-IP(第5版)

    有一个公式 xff1a 幸运 61 你做的事情 X 知道的人数 你做的事情越多 xff0c 知道的人越多 xff0c 越可能幸运 发表作品会增加你的幸运 推荐理由 由于工作现在与网络技术密切相关 xff0c 所以工作之余会重点补充这方面的知
  • 【神器】Adobe Illustrator-作图利器

    但我们却不加留意地度过我们美好的日子 xff0c 只有到了糟糕的日子真正来临的时候 xff0c 我们才会想念和渴望曾经有过的美好日子 我们脸带愁容 xff0c 许多欢乐愉快的时光未加品尝和咀嚼就过去了 xff0c 直到以后日子变得艰难和令人

随机推荐

  • 嘉立创EDA的一些使用技巧

    立创EDA专业版 使用教程 lceda cn https prodocs lceda cn cn faq editor index html绘制板框 xff1a https blog csdn net gutie bartholomew a
  • Halcon —— 图像像素类型与转换

    图像类型 就目前工业领域主流的图像处理工具halcon来讲 xff0c 有以下几种图像类型 xff1a byte complex cyclic direction int1 int2 int4 int8 real uint2 xff0c 具
  • 【神器】嘉立创EDA推荐及一些技巧

    食肉何曾尽虎头 xff0c 卅年书剑海天秋 文章幸未逢黄祖 xff0c 襆被今犹窘马周 自是汝才难用世 xff0c 岂真吾相不当侯 须知少日拏云志 xff0c 曾许人间第一流 清代 吴庆坻 题三十计小象 背景 最近因为需要 xff0c 所以
  • 【Keil】编译选项设置 Warning 为 error

    死亡是一座永恒的灯塔 xff0c 不管你驶向何方 xff0c 最终都会朝它转 一切都将逝去 xff0c 只有死神永生 刘慈欣 三体 前言 众所周知 xff0c 一般而言 xff0c 编译程序过程中的 warning 警告并不会影响可执行文件
  • 【好书推荐】计算机网络:自顶向下方法(第七版)

    人生的美妙之处在于迷上一样东西 人生苦短 xff0c 少做些虚无缥缈的事 刘慈欣 三体 推荐理由 自计算机网络诞生以来 xff0c 经过数十年的发展 xff0c 计算机的体系已经非常庞大 xff0c 同时计算机网络也大大促进了人类社会的发展
  • 【C语言内功心法】__DATE__和__TIME__帮你构建更完善的软件版本信息

    弱小和无知 xff0c 都不是生存的障碍 xff0c 傲慢才是 刘慈欣 三体 何为 DATE 和 TIME xff1f DATE 和 TIME 是 C 语言中的两个内置宏 xff0c 你可以理解为两个字符串值 xff0c 这两个宏用于记录编
  • 【好书推荐】车载以太网权威指南

    20年后 xff0c 会令你失望的不是做过的事 xff0c 而是你没做过的 xff0c 所以解开帆索 xff0c 从安全的港湾出发 xff0c 乘风而行 xff0c 去探索 去梦想 去发现 xff01 Twenty years from n
  • 【荐书】C程序设计语言(第二版)

    在大多数人眼中 xff0c 我是个一事无成 乖僻古怪 令人作呕的人 我毫无社会地位可言 xff0c 也永远不会有 总之 xff0c 我是底层人中的底层人 好吧 xff0c 就算这些看法都完全正确 xff0c 我也想有那么一天 xff0c 通
  • 【推荐书籍】C语言深度解剖

    她想要统治 xff0c 同时又要享受 xff1b 她想要王后的权柄 xff0c 还要女人的自由 xff1b 她伸出玉手 xff0c 抓起王冠 xff0c 就像拿起一件意想不到的礼物 她那时还太年轻 xff0c 不知道所有命运赠送的礼物 xf
  • 【荐书】电子设计从零开始

    人生就是不断的放下 xff0c 但最遗憾的是 xff0c 我们来不及好好告别 少年派的奇幻漂流 推荐理由 如果你想成为一名优秀的嵌入式工程师 xff0c 那么硬件的基础知识是一定要有的 xff0c 因为我们在编程的时候要经常跟硬件打交道 x
  • ROS安装教程(ubuntu18.04+melodic版本)

    1 ROS版本选择 ROS是一个用于编写机器人软件的灵活框架 xff0c 它集成了大量的工具 库 协议 xff0c 提供了类似操作系统所提供的功能 xff0c 包括硬件抽象描述 底层驱动程序管理 公用功能的执行 程序间的消息传递 程序发行包
  • 使用realsense D435i实现机械臂对物体的自动抓取总结

    1 开发环境搭建 Intel RealSense D435环境搭建之安装pyrealsense2 ModuleNotFoundError No module named 39 apt pkg 39 on Ubuntu 秃头小宝贝ec的博客
  • ZOJ - 2313 Chinese Girls' Amusement

    You must have heard that the Chinese culture is quite different from that of Europe or Russia So some Chinese habits see
  • ROS通信机制与TCP

    http blog exbot net archives 1605 http wiki ros org ROS TCPROS
  • 花两天时间写的stm32f103串口BootLoader(有keil工程)

    因为在论坛和官网都没搜到完全合适的BootLoader xff0c 所以自己移植完成了一个BootLoader工程 另外附APP文件工程 xff0c 可做实验 用良心保证 xff0c 看完后可以做一个成功的实验 上位机选用SecureCrt
  • 信号量与消息队列的区别

    出现信号量与消息队列的原因 xff1a 全局变量可以承载通信的内容 xff0c 但接受方任务需要不断检测此全局变量的值 所以产生了信号量与消息队列 信号量 xff1a 可以通知接收方某个事件的发生 xff0c 但无法传递具体事件内容 xff
  • <Unity>局部坐标(localPosition) && 世界坐标(Position)

    局部坐标 amp amp 世界坐标 的区别 1 官方文档介绍1 1 Transform Position1 2 Transform localPosition 2 问题2 1 Position真的不会受到父物体的影响吗 1 官方文档介绍 1
  • ADRC与Matlab/Similink/C++实现

    写在前面 ADRC控制算法主要分为三部分 xff0c 跟踪微分器TD 观测器ESO和状态误差反馈控制器 xff0c 其中控制器分为线性控制器PD和非线性状态误差反馈控制器NLSEF xff0c 观测器分为线性观测器LESO和非线性观测器NL
  • 状态空间方程MATLAB语句

    1 连续系统 xff08 1 xff09 使用系数矩阵获得传递函数 num den 61 ss2tf A B C D xff08 2 xff09 将传递函数写成因式分解 xff08 零极点 xff09 形式 z p k 61 ss2zp A
  • 力扣刷题

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 H指数 题目介绍一 实现思路方法一 xff1a 排序分析复杂度分析 方法二 xff1a 计数分析算法 复杂度分析 二 使用算法1 pyth