LeetCode------H-Index II

这里写图片描述

这题是之前那道H-Index 求H指数的拓展,但基本思路是一样的,H-Index思路:
这里写图片描述
只不过这里现在给的数组是升序的,所以这里我们只需要变化一下坐标即可。在O(log n)的时间内完成计算应该有很敏锐的意识应该用二分查找法,首先初始化left和right为0和数组长度n,然后取中间值mid,比较citations[mid]n-mid做比较,如果前者大,则right移到mid之前,反之right移到mid之后,终止条件是left>=right,最后返回n-left即可,参见代码如下:

package com.zhumq.lianxi;
import org.junit.Test;

public class H_index2 {
    /* 
     * 思路跟原来的h-index一样,只不过这里现在给的数组是升序的,所以这里我们只需要变化一下坐标即可
     * 
     * 原来的'i+1'和nums[i]比较变成'n-i'和nums[i]比较!
     *      nums[i]=n-i 则返回n-i
     *      nums[i]<n-i 则最大的H-Index在它右面(因为是升序的),二分搜索left=mid+1
     *      nums[i]>n-i 则最大的H-Index在它左面(因为是升序的),二分搜索right=mid
     */
    public int h_index2(int citations[]) {
        final int n = citations.length;
        int left = 0;
        int right = n;
        while(left<right) {
            int mid = left + (right-left)/2;
            if(citations[mid]==n-mid) 
                return n-mid;
            else if(citations[mid]<n-mid)
                left = mid + 1;
            else 
                right = mid;
        }
        return n - left;
    }

    @Test
    public void test1() {
        int arr[] = {0,1,3,5,6};
        System.out.println(h_index2(arr));//3
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值