一开始认为只能暴力的搜索,但是看完题解之后发现是二分查找,由此总结出二分查找的一些规律。
1.一定是按照顺序排好的数组
2.要查找数组的下标,且会和数组的值有关系
3.查找的一定是有某一特定规则的数
该题中,n-i(数组下标)是有多少篇文章,citations[i](数组的值)是引用次数
左边是文章数很多引用数很少,右边是文章数很少引用数很多
所以该题只需要使用二分查找找到引用数(值)刚好大于文章数(下标)的数组下标即可。也就是即使二分查找过程中没有找到恰好相等的值,但查找的结果也一定是符合该条件的。
class Solution {
public:
int hIndex(vector& citations) {
int n=citations.size();
//n-i是有多少篇文章,citations[i]是引用次数,其右边的都一定大于该值(因为是升序排列)
//左边是文章数很多引用数很少,右边是文章数很少引用数很多
int left=0,right=n-1;
while(left<=right){
int mid=left+(right-left)/2;
if(citations[mid]==n-mid){
return n-mid;
}
else if(citations[mid]<n-mid) left=mid+1;
else right=mid-1;
}
return n-left;
}
};