/**
* 275. H 指数 II
*
* 方法1 线性查找
* 由于题目提供的数组是已经升序排列过的,从后往前查找,找到第一个
* 被引用次数 小于等于 数组长度 减去 当前位置的编号
* citations[i] <= citations.length - i
* citations = [0,1,3,5,6]
* citations.length - i = [5,4,3,2,1]
* 题目实质 给定一个大小为 n 的升序的引用次数列表,要求找到满足 citations[i] >= n - i 的第一个 citations[i]
*
* 方案二 二分查找
* citations[i] == citations.length - i:则我们找到了想要的元素。
* 若 citations[i] < citations.length - i:由于我们想要的元素应该大于或等于 citations.length - i,
* 所以我们应该进一步搜索右边的子列表,即 citations[i + 1 : citations.length]。
* 若 citations[i] > citations.length - i:我们应该进一步搜索左边的子列表,即 citations[0 : i-1]。
* 典型的二分搜索算法的一个小区别就是,我们返回的结果是 citations.length - i,而不是所需元素的值。
*
*/
public class Solution275 {
public int hIndex(int[] citations) {
int len = citations.length, left = 0, right = citations.length - 1;
while (left <= right) {
int mid = (left + right) >> 1;
if (citations[mid] == len - mid) {
right = mid;
return len - right;
} else if (citations[mid] > len - mid) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return len - left;
}
public static void main(String args[]){
Solution275 solution275 = new Solution275();
System.out.println(solution275.hIndex(new int[]{0,1,3,5,6}));
}
}
LeetCode--275. H 指数 II
最新推荐文章于 2024-04-10 11:20:32 发布