LeetCode 275. H-Index II

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

v2-81dabb34d94040712ad3b53113f7a039_1440w.jpg


Description



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 h 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?

Seen this question in a real interview before?


描述



给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列。编写一个方法,计算出研究者的 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 指数是其中最大的那个。


进阶:

这是 H指数 的延伸题目,本题中的 citations 数组是保证有序的。

你可以优化你的算法到对数时间复杂度吗?


思路



  • 使用二分查找.
  • 二分查找的需要判断要找的元素是在当前元素的左边还是在当前元素的右边.
  • 我们用middle表示每次比较的元素的索引,count-middle 表示从middle往后数(包括)的元素个数,由于元素是按照递增排列的,如果当前元素大于等于count-middle说明存在count-middle个元素大于citations[milldle],我们将right置为middle-1.
  • 如果当前元素小于count-middle说明count-middle个元素大于citations[milldle]不成立,我们要缩小元素的个数,我们将left置为middle+1.
  • 最后count-left就是h元素的个数.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-05 12:27:25
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-05 19:58:17
class Solution:
    def hIndex(self, citations: 'List[int]') -> 'int':
        # 如果给定的数组为空,返回0
        if not citations: return 0
        count = len(citations)
        # 采用二分查找的思想
        left, right, milldle = 0, count - 1, 0
        while left <= right:
            # 去掉左边的所有非零项
            while left < count and citations[left] == 0:
                left += 1
            milldle = ((right - left) >> 1) + left
            # 如果当前位置元素值大于等于从当前位置往后数(包括当前元素)的元素个数
            if citations[milldle] >= (count - milldle):
                right = milldle - 1
            # 如果当前位置元素值小于从当前位置往后数(包括当前元素)的元素个数            
            elif citations[milldle] < (count - milldle):
                left = milldle + 1
        # 返回元素个数
        return count - left

源代码文件在这里.

目录
相关文章
LeetCode 274. H-Index
给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。
85 0
LeetCode 274. H-Index
|
索引
LeetCode 274 H-Index (H索引)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/51753099 翻译 给定一个研究者的引用数(每个引用都是非负数)的数组,写一个函数用于计算研究者的h索引。
894 0
[LeetCode] H-Index
Given an array of citations (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 Wikip
1118 0
[LeetCode] H-Index II
Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm? Hint: Expected runtime complexity is in O(log n) and the input is sort
1018 0
[LeetCode] H-Index
If you've read the Wikipedia article of H-Index, there is already a neat formula there for computing the h-index, which is written below using the notations of the problem.
903 0
|
移动开发
[LeetCode] H-Index II
This problem is designed specifically to use binary search. In fact, in H-Index, someone has already used this idea (you may refer to this post :-)) The code is as follows.
730 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2