1.二分法
class Solution {
public int hIndex(int[] citations) {
int left=0,right=citations.length-1;
while(left<=right){
int mid=(left+right)/2;
if(citations[mid] == citations.length-mid){
return citations.length-mid;
}else if(citations[mid] > citations.length-mid){
right=mid-1;;
}else{
left=mid+1;
}
}
return citations.length-left;
}
}
其实就是把遍历改为二分,理解了遍历的做法,就能理解二分的这个判断条件
if(citations[mid] > citations.length-mid) right=mid-1 就是当前这个条件已经满足了,但是往数组左边看看还有没有最优的
if(citations[mid] < citations.length-mid) left=mid+1; 就是当前这个mid位置的文章被引用的次数 小于 这个数组中所有满足这个次数的文章篇数,那就是说,前面的数肯定也是小于这个数组中所有满足这个次数的文章篇数(前面的数肯定小于这个mid)