leetcode_middle_76_274. H-Index

题意:

一个数组,代表一个学者的所有论文。每个数值代表该篇论文的引用次数。找到一个最大的数值h,使该学者有h篇论文至少都被引用h次,其它的所有论文都至多被引用h次。。



分析:

看作是一个横纵坐标的直方图,只需要两重循环,从上向下(因为要找最大的)遍历搜索y轴,内循环遍历x轴判断。

public class Solution {
    public int hIndex(int[] citations) {
        int h = citations.length;
        while(h>=1){
            int count = 0;
            for(int c: citations){
                if(h <= c)
                    count++;
            }
            if(count >= h){
                return h;
            }
            h--;
        }
        return h;
    }
}
但是我们可不可以继续优化呢?

这个时候我们要优化,必然要尝试用空间换时间了。

我们的循环能不能去掉呢?

先想清楚我们的循环在干什么?

外循环:遍历论文值,寻找最大的可能论文值。

内循环:对于一个论文值,遍历所有的论文,看有多少论文的值大于等于这个值。

我们看看有没有信息,不用去循环遍历查找,而可以存储起来的,显然最可能的信息是:有多少论文的值大于等于这个值。这个信息

所以我们可以存储这个信息。比如5篇论文:引用数为1,2,3,4,5(大于5)的分别是多少。

public class Solution {
    public int hIndex(int[] citations) {
        int[] message = new int[citations.length+1];
        int sum = 0;
        
        for(int i=0; i<citations.length; i++){
            if(citations[i] < citations.length){
                message[citations[i]]++;
            }else{
                message[citations.length]++;  
            }
        }
        int h=citations.length;
        for(; h>0; h--){
            sum += message[h];
            if(sum >= h){
                return h;
            }
        }
        return h;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值