列表

详情


275. H 指数 II

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

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

提示:如果 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

 

提示:

相似题目

H 指数

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int hIndex(vector<int>& citations) { } };

rust 解法, 执行用时: 0 ms, 内存消耗: 2.9 MB, 提交时间: 2023-10-30 00:22:49

impl Solution {
    pub fn h_index(citations: Vec<i32>) -> i32 {
        let n = citations.len();
        let (mut left, mut right) = (0, n);
        while left < right {
            let mid = left + (right - left) / 2;
            if citations[mid] as usize >= n - mid {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        (n - left) as i32
    }
}

php 解法, 执行用时: 48 ms, 内存消耗: 28.2 MB, 提交时间: 2023-10-30 00:21:56

class Solution {

    /**
     * @param Integer[] $citations
     * @return Integer
     */
    function hIndex($citations) {
        $n = count($citations);
        foreach ( $citations as $i => $h ) {
            if ( $h >= $n - $i ) {
                return $n - $i;
            }
        }
        return 0;
    }
}

golang 解法, 执行用时: 12 ms, 内存消耗: 6.8 MB, 提交时间: 2023-10-30 00:20:19

func hIndex(citations []int) int {
    n := len(citations)
    return n - sort.Search(n, func(x int) bool { return citations[x] >= n-x })
}

cpp 解法, 执行用时: 16 ms, 内存消耗: 18.4 MB, 提交时间: 2023-10-30 00:20:05

class Solution {
public:
    int hIndex(vector<int>& citations) {
        int n = citations.size();
        int left = 0, right = n - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (citations[mid] >= n - mid) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return n - left;
    }
};

javascript 解法, 执行用时: 56 ms, 内存消耗: 42.8 MB, 提交时间: 2023-10-30 00:19:52

/**
 * @param {number[]} citations
 * @return {number}
 */
var hIndex = function(citations) {
    let n = citations.length;
    let left = 0, right = n - 1;
    while (left <= right) {
        const mid = left + Math.floor((right - left) / 2);
        if (citations[mid] >= n - mid) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return n - left;
};

python3 解法, 执行用时: 32 ms, 内存消耗: 21.4 MB, 提交时间: 2023-10-30 00:19:35

class Solution:
    def hIndex(self, citations: List[int]) -> int:
        n = len(citations)
        left = 0; right = n - 1
        while left <= right:
            mid = left + (right - left) // 2
            if citations[mid] >= n - mid:
                right = mid - 1
            else:
                left = mid + 1
        return n - left

java 解法, 执行用时: 0 ms, 内存消耗: 49.3 MB, 提交时间: 2023-10-30 00:19:23

class Solution {
    public int hIndex(int[] citations) {
        int n = citations.length;
        int left = 0, right = n - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (citations[mid] >= n - mid) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return n - left;
    }
}

golang 解法, 执行用时: 12 ms, 内存消耗: 6.6 MB, 提交时间: 2021-07-12 10:12:42

func hIndex(citations []int) int {
    n := len(citations)
    for i, h := range citations {
        if h >= n - i {
            return n-i
        }
    }
    return 0
}

上一题