Given an array of citations sorted in ascending order (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index.

According to the definition of h-index on Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the other N − h papers have no more than citations each."

Example:

Input: citations = [0,1,3,5,6]
Output: 3
Explanation: [0,1,3,5,6] means the researcher has 5 papers in total and each of them had
received 0, 1, 3, 5, 6 citations respectively.
  Since the researcher has 3 papers with at least 3 citations each and the remaining
  two with no more than 3 citations each, her h-index is 3.

Note:

If there are several possible values for h, the maximum one is taken as the h-index.

Follow up:

  • This is a follow up problem to H-Index, where citations is now guaranteed to be sorted in ascending order.
  • Could you solve it in logarithmic time complexity?

这题是之前那道 H-Index 的拓展,输入数组是有序的,让我们在 O(log n) 的时间内完成计算,看到这个时间复杂度,而且数组又是有序的,应该有很敏锐的意识应该用二分查找法,属于博主之前的总结帖 LeetCode Binary Search Summary 二分搜索法小结 中的第五类,目标值 target 会随着 mid 值的变化而变化,这里的 right 的初始值和 while 循环条件是否加等号是需要注意的问题,一般来说,博主的习惯是把 right 初始化为数组的长度,然后循环条件中不加等号,但是这种 right 的初始化对于这种目标值不固定的情况下不好使,需要初始化为长度减1(目前博主还没有遇到反例,有的话请务必告知博主)。那么此时循环条件中是否要加等号,这个其实很玄学,在 Find Peak Element 中,right 也是初始化为数组长度减1,但是循环条件却不能加等号。这道题却一定需要加等号,否则会跪在 [0] 这个 test case,有些时候固有的规律并不好使,可能只能代一些 corner case 来进行检验,比如 [], [0], [1,2] 这种最简便的例子。

基于上面的分析,我们最先初始化 left 和 right 为0和 len-1,然后取中间值 mid,比较 citations[mid] 和 len-mid 做比较,如果前者大,则 right 移到 mid 之前,反之 right 移到 mid 之后,循环条件是 left<=right,最后返回 len-left 即可,参见代码如下:

class Solution {
public:
int hIndex(vector<int>& citations) {
int len = citations.size(), left = , right = len - ;
while (left <= right) {
int mid = 0.5 * (left + right);
if (citations[mid] == len - mid) return len - mid;
else if (citations[mid] > len - mid) right = mid - ;
else left = mid + ;
}
return len - left;
}
};

类似题目:

H-Index

参考资料:

https://leetcode.com/problems/h-index-ii/

https://leetcode.com/problems/h-index-ii/discuss/71063/Standard-binary-search

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] H-Index II 求H指数之二的更多相关文章

  1. [LeetCode] Majority Element II 求众数之二

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  2. [LeetCode] Majority Element II 求大多数之二

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. Note: The a ...

  3. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  4. [LeetCode] Lonely Pixel II 孤独的像素之二

    Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...

  5. [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列

    A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...

  6. [LeetCode] Redundant Connection II 冗余的连接之二

    In this problem, a rooted tree is a directed graph such that, there is exactly one node (the root) f ...

  7. [LeetCode] My Calendar II 我的日历之二

    Implement a MyCalendarTwo class to store your events. A new event can be added if adding the event w ...

  8. [LeetCode] 454. 4Sum II 四数之和之二

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  9. [LeetCode] Contains Duplicate II 包含重复值之二

    Given an array of integers and an integer k, return true if and only if there are two distinct indic ...

随机推荐

  1. SQL实用

    实用的SQL语句   行列互转 create table test(id int,name varchar(20),quarter int,profile int) insert into test  ...

  2. RFC4035笔记

    章 节 标题 说明 补充说明 支持级别 1 介绍 1.定义DNSSEC协议修改点2.定义以下概念:已签名域(signed zone)和域签名的要求列表3.描述权威域名服务器为了处理签名域的行为变化4. ...

  3. JavaScript原型链分析

    Js之原型链    1.object 与 Object        1.object是类型,表示对象类型        2.Object是函数    2.js成员的访问规则        o.方法( ...

  4. C# 本质论 第二章 数据类型

    浮点数的精度由有效数字的个数决定.除非用分数表示时,分母恰好是2的整数次幂,否则用二进制浮点类型无法准确地表示该数(0.1,表示成分数是1/10,分母10不能用有限二进制表示),二进制浮点类型无法准确 ...

  5. ASP.NET MVC传递参数(model)

    一看到此标题,相信你也会.因为路由是可以从URL地址栏传过去的. 但是Insus.NET不想在地址栏传递,还是一个条件是jQuery的Ajax进行POST的.Insus.NET不清楚别人是怎样处理的, ...

  6. AutoResetEvent ManualResetEvent WaitOne使用注意事项

    公司还用这些老家伙没办法,用了几次这俩.每次用都要重新翻一下A片. 好好的A片楞是翻译成了禅经.把这东西弄成个玄学.微软也是吃枣药丸.参考了@风中灵药的blog.写的牛逼. 还有一些公司用到的风中灵药 ...

  7. 分布式文件系统 - FastDFS 配置 Nginx 模块及上传测试

    也不说废话,直接干 上一篇 分布式文件系统 - FastDFS 在 CentOS 下配置安装部署 中安装了 FastDFS 后,并配置启动了 Tracker 和 Storage 服务,已经可以上传文件 ...

  8. 1.JAVA基础复习——计算机基础与环境变量配置

    软件开发的了解 软件开发: 软件:一系列按照特定组织的计算机数据和指令的集合. 开发:制作软件. 程序:一系列有序指令的集合. 人机交互 人机交互的方式有两种:图形化界面和命令行方式. 图形化界面:简 ...

  9. 2016年6月份那些最实用的 jQuery 插件专辑

    jQuery 是一个快速.流行的 JavaScript 库,jQuery 用于文档处理.事件处理.动画和 Ajax 交互非常简单,学习曲线也很平坦.2016年6月的 jQuery 插件专辑里,我们选择 ...

  10. Android 7.0 Nougat牛轧糖 发布啦

    Android 7.0 Nougat牛轧糖 发布啦 Android 7.0 Nougat 牛轧糖于本月发布了. 从官方blog里可以了解到这个版本的新特性. Android 7.0 从2016年8月正 ...