题目略,思想相同
解答:
主要就是先排序,然后找到最大的h,在找最大的过程中,可以建模称为一个线相交题目
经过分析可以发现,最大h就是citation这个数组和size - pos(pos是数组下标,size是数组的大小)这两个线连接起来的交点
1.两条线确实有交点,并且交点的横坐标是x,那么这个时候就直接h就是size - x
2.有交点,但是交点的横坐标不是整数,这 个时候就是距离交点x最近的整点的横坐标t,h就是size - t
3.无交点,这个时候直接就是min(citation,size - pos)
综上所述,可以直接用二分搜索查找最近的相交点即可
class Solution {
public:
int min(int a,int b)
{
return a < b ? a : b;
}
int hIndex(vector<int>& citations) {
int l = 0;
int size = citations.size();
if(size == 0)
return 0;
int r = size - 1;
int mid;
while(l < r)
{
mid = (l + r) >> 1;
if(citations[mid] == size - mid)
return size - mid;
else if(citations[mid] < size - mid)
l = mid + 1;
else
r = mid;
}
return min(citations[l],size - l);
}
};