题目说明了数组是已经从小到大排序的,又要求时间复杂度为O(logn),那么这时候就要有使用二分查找的敏感度。二分查找的条件自然就是citations[mid] == (n - mid)。如果(n - mid) > citations[mid],那么说明包括的文章数量多了,应该left++,减小包括文章的范围。如果最后没有找到citations[mid] == (n - mid)的情况,那么return n - low,为什么return的是n - low呢?我们可以这样来思考一下,在退出循环前的最后一步必然有l = r,如果在这种情况下有citations[mid] < n - mid,那么l++,会跳过这种情况;而如果是citations[mid] > n - mid,r--,l不变,会包括这种情况,而且l小于这个值之前的情况都是不行的,所以总的来说return n - low是正确的。代码如下:
public class Solution {
public int hIndex(int[] citations) {
int n = citations.length;
int low=0, high=n-1;
while(low<=high) {
int mid = low + (high-low)/2;
if(citations[mid] == n-mid) return n-mid;
else if(citations[mid] < n-mid) low = mid+1;
else high = mid-1;
}
return n-low;
}
}
知识点:
1. O(logn),已排序数组:要向二分查找的方向去思考