h指数实际将将index和value建立起来了联系,h指数的范围一定是[0,n],因此存在一种O(n)的做法
翻译一下就是对于升序排列的数组,找到第一个i,满足citations[i]>=n-1, 答案就是n-1
class Solution {
public:
int hIndex(vector<int>& citations) {
int n = citations.size();
for(int i=0;i<citations.size();i++){
if(citations[i]>=n-i) return n-i;
}
return 0;
}
};
很容易用二分优化到O(logN)
class Solution {
public:
int hIndex(vector<int>& citations) {
int n = citations.size();
int left = 0, right=n-1;
while(left<=right){
int mid = (left+right)/2;
if(citations[mid]>=n-mid) right = mid-1;
else left = mid+1;
}
return n-left;
}
};
对于未排序数组,先进行排序后时间复杂度是O(NlogN)
想要优化到O(N)不能排序
这个比较难,这里就不讲了