[Java][Leetcode middle] 274. H 指数

没做出来,看的解析。

一、 先对数组进行逆序,然后判断是否符合

3,0,6,1,5\] --\> \[6,5,3,1,0

对于i=3时:如果hIndex想为4(4个引用4以上的论文),那么:citations3 需要大于等于4(I+1)。 一旦不满足,说明不符合本条件,直接返回i即可。

java 复制代码
class Solution {
    public int hIndex(int[] citations) {
         Arrays.sort(citations);
         reverse(citations);

         for(int i=0;i<citations.length;i++){
              if(citations[i] <i+1){
                 return i;
              }
         }
         return citations.length;
    }

    public void reverse(int[] nums){
         int start = 0;
         int end = nums.length-1;
         while(start < end){
            int tmp = nums[start];
            nums[start] = nums[end];
            nums[end] = tmp;
            start++;
            end--;
         }
    }
}

二、 先对数组进行正序,然后判断是否符合

就是上一个的转置版本

3,0,6,1,5\] --\> \[0, 1, 3 ,5 ,6

n-i: 5 4 3 2 1

如果要满足条件,citationsI 必须大于等于n-i

java 复制代码
class Solution {
    public int hIndex(int[] citations) {
         Arrays.sort(citations);
         int n = citations.length;
         for(int i=0;i<n ;i++){
              if(citations[i] >= n-i){
                 return n-i;
              }
         }
         return 0;
    }
}

三、使用一个数组统计 引用次数为i的论文数量

o(N)

java 复制代码
class Solution {
    public int hIndex(int[] citations) {
        int n = citations.length;
        // 引用次数为i的论文数量(0-n,共n+1项)
        int[] counts  = new int[n+1];

        for(int cite : citations){
            if(cite >=n){
                counts[n]++;
            }else{
                counts[cite]++;
            }
        }
        
        int total = 0;
        for(int i = n;i>=0;i--){
            total += counts[i];
            if(total >= i){
                return i;
            }
        }
        return 0;
    }

}

四、利用二分查找

  • O(N log N)
  • hIndex最小是0,最大是数组长度n
  • 先猜测一个hIndex值mid,然后在数组中统计这个值是否满足条件。如果满足,说明至少是mid,还有可能更多。如果不满足,则缩小查找范围。
java 复制代码
class Solution {
    public int hIndex(int[] citations) {
        
         int left = 0,right = citations.length;
         int mid = 0;
         int i;
         int cnt=0;

         while(left<right){
            mid = (left + right + 1) >>1;

            cnt = 0;
            for(i=0;i<citations.length;i++){
                if(citations[i] >= mid){
                    cnt ++;
                }
            }
            if(cnt >= mid){
               left = mid;
            }else{
               right = mid - 1;
            }
         }
         return left;
    }
}
相关推荐
shuoshuohaohao14 分钟前
MyBatis 小知识点
java·spring·mybatis
海上小飞龙27 分钟前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂44 分钟前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i44 分钟前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
谢亮_vipxieliang1 小时前
泛型擦除、通配符与 PECS 一次讲透
java·面试
八解毒剂1 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
乐迪信息2 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
打工仔折腾 AI2 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
ZealSinger2 小时前
Java虚拟线程上线后瓶颈转移到哪看三层
java·开发语言·firefox
2601_961133283 小时前
盘立方软件指标文华期货公式下载
java