面试经典题目:LeetCode274_H指数

leetcode274——H指数

      • 暴力循环
        • 代码分析
        • 性能分析
      • 方法1:排序加线性扫描
        • 算法步骤:
      • 方法2:计数排序(适用于引用次数有上限)
        • 算法步骤:

这段代码是用来计算一个研究者的H指数的。H指数是一种衡量科研人员学术影响力的方法,定义为:如果一位科研人员发表了h篇文章,每篇文章至少被引用了h次,则该科研人员的H指数为h。

题目链接:leetcode274_H指数

暴力循环


class Solution {
public:int hIndex(vector<int>& citations) {unordered_map<int, int> tmp;for (int i = 1; i <= citations.size(); i++){for (int j = 0; j < citations.size(); j++){if (citations[j] >= i){tmp[i]++;}}if (tmp[i] < i)return i - 1;}return citations.size();}};
代码分析
  1. 输入参数

    • vector<int>& citations:一个整数数组,表示每篇论文的引用次数。
  2. 变量声明

    • unordered_map<int, int> tmp:用于存储每个引用次数对应的论文数量。
    • int iint j:循环变量。
  3. 外层循环

    • for (int i = 1; i <= citations.size(); i++):遍历从1到论文总数的所有可能的H指数值。
  4. 内层循环

    • for (int j = 0; j < citations.size(); j++):遍历每篇论文的引用次数。
    • if (citations[j] >= i):检查当前论文的引用次数是否大于等于当前假设的H指数值i。
    • tmp[i]++:如果满足条件,则增加计数器。
  5. 判断条件

    • if (tmp[i] < i):如果当前假设的H指数值i对应的论文数量小于i,则返回i-1作为H指数。
  6. 返回值

    • 如果所有可能的H指数值都检查完毕,没有找到合适的H指数,则返回论文总数减1。
性能分析
  • 这段代码的时间复杂度为O(n^2),其中n是论文的数量。这是因为有两个嵌套循环,每个循环都需要遍历整个数组。
  • 空间复杂度为O(n),因为使用了一个哈希表来存储每个引用次数对应的论文数量。

改进建议

  • 可以通过排序和二分查找来优化算法,将时间复杂度降低到O(n log n)。
  • 使用计数排序或桶排序可以进一步优化到O(n)。

根据上述的改进建议,我们可以采取以下两种方法来优化H指数计算算法:

方法1:排序加线性扫描

这个方法的思想是先对引用次数进行排序,然后从高到低遍历排序后的数组,找到最大的i值,使得前i篇论文每篇至少被引用了i次。

算法步骤:
  1. 对引用次数数组进行降序排序。
  2. 从头开始遍历排序后的数组,对于每个索引i(从0开始),检查是否满足条件citations[i] >= i+1
  3. 如果条件不再满足,则返回当前的i作为H指数。
  4. 如果遍历结束仍未找到不满足条件的情况,则返回数组长度作为H指数。

时间复杂度:O(n log n),因为排序的时间复杂度为O(n log n)。
空间复杂度:O(1),如果使用原地排序算法的话,不需要额外的空间。

int hIndex(vector<int>& citations) {sort(citations.begin(), citations.end(), greater<int>()); // 按降序排序int i = 0;for (; i < citations.size() && citations[i] > i; ++i);return i;
}

方法2:计数排序(适用于引用次数有上限)

如果引用次数有一个合理的上限,比如不超过论文总数或某个固定的最大值,我们可以用计数排序来实现更高效的算法。该方法特别适合于引用次数不是非常大的情况。

算法步骤:
  1. 创建一个大小为n+1的数组counts用于计数,其中n是论文数量。
  2. 遍历citations数组,对于每个引用次数c,如果c大于等于n,则在counts[n]中增加计数;否则,在counts[c]中增加计数。
  3. 从后往前遍历counts数组,累计论文数量total,直到total大于等于当前索引i,此时i即为H指数。

时间复杂度:O(n),因为我们只需要遍历一次citations和一次counts
空间复杂度:O(n),需要额外的counts数组。

int hIndex(vector<int>& citations) {int n = citations.size();vector<int> counts(n + 1, 0);// 计算每个引用次数出现的频次for (int c : citations)counts[min(c, n)]++;// 从高往低累积论文数量,寻找H指数int total = 0;for (int i = n; i >= 0; --i) {total += counts[i];if (total >= i)return i;}return 0;
}

这两种方法都可以有效地减少原始代码中的冗余计算,并且提高了时间效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端爬虫】关于如何获取自己的请求头信息(user-agent和cookie)

注意&#xff1a;由于user-agent和cookie中保存了部分账户信息&#xff0c;所以一定不要随意泄露给他人&#xff01;&#xff01;&#xff01; 1.首先打开某个页面&#xff0c;点击键盘的F12键进入控制台&#xff0c;或者鼠标右键页面选择打开控制台 2.然后点击控制台上方的网…

将java项目部署到linux

命令解析 Dockerfile: Dockerfile 是一个文本文件&#xff0c;包含了所有必要的指令来组装&#xff08;build&#xff09;一个 Docker 镜像。 docker build: 根据 Dockerfile 或标准指令来构建一个新的镜像。 docker save: 将本地镜像保存为一个 tar 文件。 docker load: 从…

Chrome 浏览器原生功能截长屏

我偶尔需要截取一些网页内容作为素材&#xff0c;但偶尔内容很长无法截全&#xff0c;需要多次截屏再拼接&#xff0c;过于麻烦。所以记录下这个通过浏览器原生功能截长屏的方案。 注意 这种方案并不是百分百完美&#xff0c;如果涉及到一些需要滚动加载的数据或者悬浮区块&am…

Python+OpenCV系列:AI看图识人、识车、识万物

在人工智能风靡全球的今天&#xff0c;用 Python 和 OpenCV 结合机器学习实现物体识别&#xff0c;不仅是酷炫技能&#xff0c;更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入&#xff0c;识别人、动物、车辆及其他物品&#xff0c;让你的程序瞬间具备 AI …

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql

Hive其一,简介、体系结构和内嵌模式、本地模式的安装

目录 一、Hive简介 二、体系结构 三、安装 1、内嵌模式 2、测试内嵌模式 3、本地模式--最常使用的模式 一、Hive简介 Hive 是一个框架&#xff0c;可以通过编写sql的方式&#xff0c;自动的编译为MR任务的一个工具。 在这个世界上&#xff0c;会写SQL的人远远大于会写ja…

百度智能云千帆AppBuilder升级,百度AI搜索组件上线,RAG支持无限容量向量存储!

百度智能云千帆 AppBuilder 发版升级&#xff01; 进一步降低开发门槛&#xff0c;落地大模型到应用的最后一公里。在千帆 AppBuilder 最新升级的 V1.1版本中&#xff0c;企业级 RAG 和 Agent 能力再度提升&#xff0c;同时组件生态与应用集成分发更加优化。 • 企业级 RAG&am…

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…

c语言——数据结构【链表:单向链表】

上篇→快速掌握C语言——数据结构【创建顺序表】多文件编译-CSDN博客 一、链表 二、单向链表 2.1 概念 2.2 单向链表的组成 2.3 单向链表节点的结构体原型 //类型重定义,表示存放的数据类型 typedef int DataType;//定义节点的结构体类型 typedef struct node {union{int l…

【AI图像生成网站Golang】项目测试与优化

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与优化 六、项目测试与优化 在开发过程中&#xff0c;性能优化是保证项目可扩展性和用户体验的关键步骤。本文将详细介绍我如何使用一…

Mybatis映射关系

目录 多对一 方式一&#xff1a;一条sql语句&#xff08;级连属性映射&#xff09; 方式二&#xff1a;一条sql语句&#xff08;association&#xff09; 方式三&#xff1a;两条sql语句&#xff0c;分步查询 一对多 方式一&#xff1a;collection 方式二&#xff1a;分…

隐私清理工具Goversoft Privazer

PrivaZer 是一款专为隐私保护而生的 Windows 系统清理工具&#xff0c;支持深度扫描、清除无用文件和隐私痕迹。 PrivaZer - 深度扫描磁盘&#xff0c;自动清理上网痕迹&#xff0c;全面保护 Windows 的网络隐私 释放磁盘空间 硬盘空间告急&#xff0c;想清理却又无从下手&…

基于Spring Boot的医院质控上报系统

一、系统背景与意义 医院质控上报系统旨在通过信息化手段&#xff0c;实现医院质量控制的标准化、流程化和自动化管理。该系统能够帮助医院实时监控医疗质量数据&#xff0c;及时发现和处理潜在的质量问题&#xff0c;从而确保医疗服务的安全性和有效性。同时&#xff0c;系统…

Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Python-基于Pygame的小游戏(坦克大战-1.0(世界))(一)

前言:创作背景-《坦克大战》是一款经典的平面射击游戏&#xff0c;最初由日本游戏公司南梦宫于1985年在任天堂FC平台上推出。游戏的主题围绕坦克战斗&#xff0c;玩家的任务是保卫自己的基地&#xff0c;同时摧毁所有敌人的坦克。游戏中有多种地形和敌人类型&#xff0c;玩家可…

【达梦数据库】Coredump文件生成与分析

目录 背景参考链接分析Coredump文件获取问题SQL1、查看Coredump文件生成路径2、使用gdb工具读取Coredump文件3、记录崩溃线程堆栈4、记录当前崩溃线程号5、使用dmrdc工具分析Coredump文件6、寻找线程号对应SQL7、重新执行SQL&#xff0c;复现问题 记录Coredump文件中所有线程的…

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…

基于SCUI的后台管理系统

一、SCUI Admin 官方地址&#xff1a;https://python-abc.xyz/scui-doc/ 高性能中后台前端解决方案&#xff0c;基于 Vue3、elementPlus 持续性的提供独家组件和丰富的业务模板帮助你快速搭建企业级中后台前端任务。 预览地址&#xff1a;https://python-abc.xyz/scui-doc/de…

vscode不同的项目使用不同的环境变量或编译环境

转载请标明出处&#xff1a;小帆的帆的博客 假如电脑中安装的两套C编译环境&#xff0c;想要切换编译环境时可以在操作系统的环境变量中调整顺序&#xff0c;然后排在前面的环境就会被使用。 这样做的弊端&#xff1a; 麻烦容易忘&#xff0c;忘了项目不报错就可能就不会发现…

知网研学 | 知网文献(CAJ+PDF)批量下载

知网文献&#xff08;CAJPDF&#xff09;批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件&#xff0c;格式为es6文件&#xff0c;需使用知网研学软件打开&#xff0c;故需先安装该…