面试经典题目: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.然后点击控制台上方的网…

爬虫抓取的数据如何有效存储和管理?

在现代数据驱动的世界中&#xff0c;爬虫技术已成为获取网络数据的重要手段。然而&#xff0c;如何有效地存储和管理这些数据是一个关键问题。本文将详细介绍几种有效的数据存储和管理方法&#xff0c;并提供相应的Java代码示例。 1. 数据存储方式 1.1 文件存储 文件存储是最…

将java项目部署到linux

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

Next.js 13 App Router实战踩坑与性能优化指南

去年年底&#xff0c;我接了一个海外客户的项目&#xff0c;要求使用 Next.js 13 的 App Router 开发一个数据分析平台。说实话&#xff0c;当时虽然对 Next.js 已经很熟悉了&#xff0c;但对 App Router 这个相对较新的特性还是有些忐忑。现在项目已经成功上线&#xff0c;我想…

MySQL 中快速插入大量数据

在 MySQL 中快速插入大量数据&#xff08;例如 20 万条记录&#xff09;可以通过多种方法实现。以下是一些优化技巧和步骤&#xff0c;可以帮助你高效地插入大量数据&#xff1a; 1. 禁用索引和约束&#xff08;如果可能&#xff09; 在插入大量数据之前&#xff0c;禁用索引和…

Chrome 浏览器原生功能截长屏

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

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

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

关于如何正确在测试用例中mock静态方法的问题

文章目录 情况一&#xff1a;希望在测试用例中直接执行静态方法的逻辑情况二&#xff1a;不希望在测试用例中执行静态方法的逻辑插桩方法坑1: 报错SubclassByteBuddyMockMaker原因与解决方案坑2&#xff1a;报错 the existing static mock registration must be deregistered原…

Shell自定义(二)

1.Shell自定义 1.初始化 定义全局变量environ&#xff0c;把g_env的内容用memset初始化为0&#xff0c;这里用malloc开辟的空间为对应环境变量的长度1&#xff0c;多1位置是最后结束符0&#xff0c;strcpy把此时的对应的环境变量拷贝到g_env里面&#xff0c;下面是新增一个环…

PHPstudy中的数据库启动不了

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

安装与配置MongoDB 6.0以支持远程连接

安装与配置MongoDB 6.0以支持远程连接 目录 安装curl工具下载并导入MongoDB 6.0 PGP密钥向APT导入MongoDB 6.0版软件包的资源链接安装MongoDB依赖libssl1.1安装MongoDB启动并检查MongoDB服务状态进入MongoDB Shell交互式执行环境设置MongoDB开机自启配置MongoDB允许远程连接 …

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…

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误 您在 Ubuntu 20.04 上编译 OpenCV 3.2 时遇到的错误与 C 标准库的头文件配置问题有关。错误消息指出系统无法找到 <stdlib.h>&#xff0c;这通常与预编译头文件的处理、GCC 版本或者头文件搜索路径有关。下面…

Swagger自动文档工具以及gin-swagger的使用

什么是 Swagger&#xff1f; Swagger 是一个开源的 API 设计和文档工具&#xff0c;旨在帮助开发者更高效地设计、构建、记录和测试 RESTful API。它基于 OpenAPI 规范&#xff08;前身为 Swagger 规范&#xff09;&#xff0c;通过自动化的方式生成交互式 API 文档、客户端 S…

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

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

为什么要用单例模式?

‌单例模式是一种创建型设计模式&#xff0c;用于确保某个类只有一个实例&#xff0c;并提供一个全局访问点&#xff0c;使得其他类可以轻松访问该实例‌。 使用单例模式的主要原因包括以下几点&#xff1a;‌ ‌确保唯一性‌&#xff1a;在某些情况下&#xff0c;我们需要确…

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

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

在Linux中使用`scp`进行远程目录文件复制

在Linux系统中&#xff0c;scp&#xff08;安全复制协议&#xff09;是一个使用SSH&#xff08;安全外壳协议&#xff09;进行文件和目录安全传输的命令。它允许在远程主机之间复制文件和目录&#xff0c;具有很强的安全性&#xff0c;是一种常用的文件传输工具。以下是如何使用…

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

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