LeetCode 每日一题 H 指数

首先我们来看一下7月11日的H指数

附原题传送门H指数

图一

就题目本身而言其实是很简单的,只是对于文字理解上可能对于一部分人来说有困难(lc评论区都是吐槽题目文字的晦涩难懂),题目中的h指数,其实就是指作者文章有h篇文章被至少引用了h次。至少一次也就是一个向下包含的关系。我们首先看一下示例{3,0,6,1,5}数组中的值代表了没票文章被引用的次数。
通过观察我们不难发现有3篇文章的引用次数是大于3的,这句话可以等价于图一leetcode例题解释中的由于研究这有三篇论文每篇至少被引用了3次。解释中后一句的N-h篇论文每篇论文被引用次数不超过h次,也就是说{3,0,6,1,5}数组中去除大于3的N-h篇,也就是5-3=2篇,剩下的两篇{0,1}不大于h次。

接下来废话不多说直接上代码

    //桶的思想和贪心
public int hIndex(int[] citations) {
    //先求出桶的最大容量,也就是文章的最大引用次数
    int max=0;
    for (int i = 0; i < citations.length; i++) {
        if(citations[i]>max) max=citations[i];
    }
    //桶的下标表示被引用的次数,值表示超过被引用次数的次数
    int[] buckets=new int[max+1];
    //循环给桶内元素赋值
    for (int i = 0; i < citations.length; i++) {    
        //由于至少一词是一个向下包含的关系,比如说6包括{5,4,3,2,1},所以说对应的值次数也要统计
        for (int j = citations[i]; j >= 0; j--) {
            buckets[j]++;
        }
    }
    //倒序查找符合题意的h值
    for (int i = buckets.length-1; i >=0 ; i--) {
        //有 h 篇论文分别被引用了至少 h 次
        if(buckets[i]>=i) {
            return i;
        }
    }
    return -1;
}

很多人可能会在[100]、[1,3,1]等类似数据提交不通过,就是没有考虑到一个向下包含的关系。

你可能感兴趣的:(LeetCode 每日一题 H 指数)