力扣打卡 275-H指数 ||

Problem: 275. H 指数 II

思路

数组按照升序排序,答案集中在数组中间部分,想到二分查找。

解题方法

整数数组 citations,表示了研究论文的引用次数。

使用二分查找的方法来找到合适的H指数。二分查找的初始范围是 leftright,分别初始化为数组的第一个元素和最后一个元素的索引。

在循环中,代码计算中间元素的索引 mid,并获取中间元素 citations[mid] 的引用次数。

接下来,代码检查 citations[mid] 是否大于等于 n - mid。这是因为H指数的定义是:至少有 n - mid 篇论文被引用了至少 n - mid 次。如果 citations[mid] 大于等于 n - mid,则说明H指数需要减小,因此将 right 范围缩小到 mid - 1

如果 citations[mid] 小于 n - mid,则说明H指数需要增加,因此将 left 范围扩大到 mid + 1

循环一直进行,直到 left 大于 right,此时找到了合适的H指数。

最后,返回 n - left 作为H指数的值。这是因为 left 是最后一次满足条件的位置,而H指数是 n - left

复杂度

  • 时间复杂度:
    O ( l o g n ) O(logn) O(logn)

  • 空间复杂度:
    O ( 1 ) O(1) O(1)

Code

class Solution {
    public int hIndex(int[] citations) {
    	//论文个数
        int n = citations.length;
        int left = 0, right = n - 1;
        while(left <= right){
        	//中间元素索引mid
            int mid = (left + right) / 2;
            //若中间元素的索引次数大于n-mid,说明H指数需要减小
            if(citations[mid] >= n - mid){
                right = mid - 1;
            }
            //若中间元素的索引次数小于于n-mid,说明H指数需要增加
            else{
                left = mid + 1;
            }
        }
        // left 是最后一次满足条件的位置,而H指数是 n - left。
        return n - left;
    }
}

你可能感兴趣的:(leetcode)