题目描述(中等难度)
求 ,和 上一道题 一样,只不过这道题给定的数组是有序的,详细的可以先做一下上一题。
解法一
先看一下之前的其中一个的做法。
点的垂线与直线交点的纵坐标的求法是 n - i
,n
是数组长度,i
是数组下标。
代码如下。
说白了,我们是要寻找第一个在直线上方(包括在直线上)的点,给定数组是有序的,所以我们可以用二分查找。
public int hIndex(int[] citations) {
int n = citations.length;
int low = 0;
int high = n - 1;
int mid = (low + high) >>> 1;
if (citations[mid] >= n - mid) {
if (mid == 0) {
return n;
}
//前一个点是否在直线下方
int before = mid - 1;
if (citations[before] < n - before) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return 0;
}
总
添加好友一起进步~
如果觉得有帮助的话,可以点击 给一个 star 哦 ^^