这题是之前那道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
}
}