news 2026/4/16 7:21:49

day123—二分查找—H 指数 II(LeetCode-275)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day123—二分查找—H 指数 II(LeetCode-275)

题目描述

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

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的h指数是指他(她)的 (n篇论文中)至少h篇论文分别被引用了至少h次。

请你设计并实现对数时间复杂度的算法解决此问题。

示例 1:

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

示例 2:

输入:citations = [1,2,100]输出:2

提示:

  • n == citations.length
  • 1 <= n <= 105
  • 0 <= citations[i] <= 1000
  • citations升序排列

解决方案:

算法目标

计算科研人员的H指数:找到一个最大的整数h,使得该科研人员至少有h篇论文的被引用次数至少为h次

核心思路

  1. 排序论文引用次数:便于后续统计

  2. 二分查找h值:在[0, n]范围内查找满足条件的最大h

  3. 验证条件:统计引用次数≥h的论文数量是否≥h

算法步骤

1. 预处理

sort(citations.begin(), citations.end());

  • 对引用次数进行排序

  • 虽然排序不是必需的,但能使二分查找更直观

2. 确定查找范围

int left = -1; // 不可行的下界

int right = len + 1; // 可行的上界(开区间)

  • h的取值范围:[0, n](n为论文总数)

  • 使用开区间(left, right),保证left不可行,right可行

3. 二分查找

while(left + 1 < right) { int mid = (left + right) / 2; // 尝试的h值 int ans = 0; // 统计引用次数 ≥ mid 的论文数 for(auto a : citations) { if(a >= mid) ans++; } if(ans >= mid) { left = mid; // mid可行,尝试更大的h } else { right = mid; // mid不可行,尝试更小的h } }

4. 返回结果

return left; // 最大的可行h值

关键点解释

循环不变量

  • left:最后一个已知可行的h值

  • right:第一个已知不可行的h值

  • 区间(left, right)为开区间,其中可能有可行值

判断逻辑

  • 如果ans >= mid:有至少mid篇论文被引用至少mid次 → mid可行

  • 如果ans < mid:不满足h指数条件 → mid不可行

返回值

  • 返回left,即最大的可行h值

  • 因为right是第一个不可行的h值,left是最后一个可行的h值

时间复杂度

  • 排序:O(n log n)

  • 二分查找:O(log n)次迭代

  • 每次迭代统计:O(n)

  • 总时间:O(n log n)

空间复杂度

  • O(1) 或 O(n)(取决于排序算法)

示例

citations = [3,0,6,1,5]
排序后: [0,1,3,5,6]

二分查找过程:
尝试 h=2: 有3篇≥2 → 可行
尝试 h=4: 有2篇≥4 → 不可行
尝试 h=3: 有3篇≥3 → 可行
结果: h=3

算法特点

  1. 通用性强:不依赖特殊数据结构

  2. 逻辑清晰:直接对应H指数定义

  3. 效率适中:适合中等规模数据

  4. 易于理解:二分查找框架清晰

函数源码:

class Solution { public: int hIndex(vector<int>& citations) { sort(citations.begin(),citations.end()); int len =citations.size(); int left=0; int right=len+1; while(left+1<right){ int mid=(left+right)/2; int ans=0; for(auto a:citations){ if(a>=mid) ans+=1; } if(ans>=mid) left=mid; else right=mid; } return left; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 0:17:13

从零搭建VSCode量子作业监控面板:3小时快速上手教程,错过等于落伍

第一章&#xff1a;VSCode 的量子作业监控面板在现代量子计算开发中&#xff0c;可视化与实时监控是提升调试效率的关键。VSCode 通过扩展插件架构&#xff0c;支持集成定制化的量子作业监控面板&#xff0c;使开发者能够在编码环境中直接观察量子电路执行状态、资源分配及任务…

作者头像 李华
网站建设 2026/4/16 7:20:45

【收藏必备】2023年大模型转型完全指南:从零入门到就业的全方位攻略

这篇文章提供了大模型领域从零到就业的全面转型攻略&#xff0c;包括明确职业方向、掌握基础知识、深入学习大模型技术、参与实践项目、加入开源社区、利用学习资源以及职业发展建议等内容。文章不仅提供了技术学习路径&#xff0c;还包含了职业规划和持续学习的方法&#xff0…

作者头像 李华
网站建设 2026/4/13 3:43:22

基于大数据挖掘技术的台风灾害预测系统(毕业设计项目源码+文档)

课题摘要 基于大数据挖掘技术的台风灾害预测系统&#xff0c;直击台风灾害防控 “数据来源分散、预测模型单一、预警响应滞后” 的核心痛点&#xff0c;依托 HadoopSparkTensorFlow 大数据挖掘技术体系&#xff0c;构建 “多源数据融合 智能模型预测 可视化预警赋能” 的一体…

作者头像 李华
网站建设 2026/4/9 8:39:51

车载通信测试60天学习计划:Day5 核心知识点(纯干货)

一、车载诊断核心协议&#xff1a;DoIP与UDS&#xff08;岗位核心技能&#xff09;1. DoIP协议基础&#xff08;诊断通信-over-IP&#xff09;&#xff08;1&#xff09;核心定位与价值DoIP&#xff08;Diagnostic over IP&#xff09;是基于以太网的诊断协议&#xff0c;替代传…

作者头像 李华
网站建设 2026/4/5 18:49:57

如何在Linux上轻松配置网络共享?Stacer图形化工具全解析

如何在Linux上轻松配置网络共享&#xff1f;Stacer图形化工具全解析 【免费下载链接】Stacer Linux System Optimizer and Monitoring - https://oguzhaninan.github.io/Stacer-Web 项目地址: https://gitcode.com/gh_mirrors/st/Stacer 你是否曾经因为复杂的Linux命令行…

作者头像 李华
网站建设 2026/4/7 12:30:17

2亿融资!AI营销明星玩家揭秘

进入2025年&#xff0c;人工智能对商业世界的重塑已从宏大叙事演变为深入产业肌理的精微实践。其中&#xff0c;AI营销领域无疑是变革最为剧烈的战场之一。资本的嗅觉最为敏锐&#xff0c;当传统数字营销的增长曲线日趋平缓&#xff0c;大量热钱正以前所未有的规模涌入AI营销赛…

作者头像 李华