# 275 - 「java」变种二分法 解决『H指数 II』的 详细思路与解法
Tags:
- 中等
- 数组
- 二分法
- java
题目链接:
解题思路:
本题是H指数的变种与优化, 实现思路完全相同, 不过本题中要求实现log(n)级别的时间复杂度, 所以使用二分查找法重新优化解题方式:
- 题目中已经限定了原数组为递增数组;
- 原题要找到论文引用次数的数组citations[]中, 筛选条件为: 有h个元素的值至少要为h, 求满足这个条件的最大的h;
- 可以将题目中简化为模型: 从数组citations[]中找出角标i, 要使得元素值(citations[i]) >= 元素个数(citations.length - i) , 并且要在满足这个条件的情况下, 找到i最小的解(这样的话, citations.length - i值最大)
- 因为输入限定为递增数组, 所以可以使用稍微改进的二分查找, 查找满足条件的角标i, 并且实时更新满足条件的值(为求满足条件的最大值);
实现代码:
class Solution {
public int hIndex(int[] citations) {
//二分查找
int l = citations.length;
if(l == 1){ //边界条件处理
return citations[0] >=1 ? 1 :0;
}
int start = 0;
int end = l-1;
int ans = 0;
while(start <= end){
int mid = (start + end)>>1;
int t = citations[mid]; //当前角标的文章有t次引用
int count = l-mid; //有count篇文章有比当前元素有更多次的引用
//题目要求, count篇文章至少被引用count次
if(count <= t){ //满足要求, 需要再次确认是否还有满足要求的更多的数量
ans = count; //更新ans, 以记录满足条件的最大返回值
end = mid-1;
}else{
start = mid+1;
}
}
return ans;
}
}
提交记录[20210712]:
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:45.3 MB, 在所有 Java 提交中击败了51.59%的用户

浙公网安备 33010602011771号