# 275 - 「java」变种二分法 解决『H指数 II』的 详细思路与解法

Tags:

  • 中等
  • 数组
  • 二分法
  • java

题目链接:

275. H 指数 II

解题思路:

本题是H指数的变种与优化, 实现思路完全相同, 不过本题中要求实现log(n)级别的时间复杂度, 所以使用二分查找法重新优化解题方式:

  1. 题目中已经限定了原数组为递增数组;
  2. 原题要找到论文引用次数的数组citations[]中, 筛选条件为: 有h个元素的值至少要为h, 求满足这个条件的最大的h;
  3. 可以将题目中简化为模型: 从数组citations[]中找出角标i, 要使得元素值(citations[i]) >= 元素个数(citations.length - i) , 并且要在满足这个条件的情况下, 找到i最小的解(这样的话, citations.length - i值最大)
  4. 因为输入限定为递增数组, 所以可以使用稍微改进的二分查找, 查找满足条件的角标i, 并且实时更新满足条件的值(为求满足条件的最大值);

实现代码:

class Solution {
    public int hIndex(int[] citations) {
        //二分查找
        int l = citations.length;
        if(l == 1){ //边界条件处理
            return citations[0] >=1 ? 1 :0;
        }
        int start = 0;
        int end = l-1;
        int ans = 0;
        while(start <= end){
            int mid = (start + end)>>1;
            int t = citations[mid];    //当前角标的文章有t次引用
            int count = l-mid;  //有count篇文章有比当前元素有更多次的引用

            //题目要求, count篇文章至少被引用count次
            if(count <= t){ //满足要求, 需要再次确认是否还有满足要求的更多的数量
                ans = count;    //更新ans, 以记录满足条件的最大返回值
                end = mid-1;
            }else{
                start = mid+1;
            }
        }
        return ans;
    }

}

提交记录[20210712]:

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:45.3 MB, 在所有 Java 提交中击败了51.59%的用户
posted @ 2023-03-23 18:13  zhiyuanZAG  阅读(44)  评论(0)    收藏  举报