题目链接:https://leetcode.com/problems/h-index-ii/
Follow up for H-Index: What if the citations
array is sorted in ascending order? Could you optimize your algorithm?
思路:接上题,上题给的数组是无序的,我们可以利用基于统计的排序将时间复杂度降为O(n),而本题的数据是有序了,我们可以利用二分查找将时间复杂度降为(log n).
每次二分取中间的值,我们关注这个mid位置到最右边的距离(即大于citations[mid]的有几篇文章)和citations[mid]的关系
1.即如果(len - mid) == citations[mid],则这个距离就是我们能够得到的最大h-index
2.如果(len - mid) < citations[mid],则说明我要找的位置在中点的左边,即我们有更多引用次数超过(len - mid)的文章
3.如果(len - mid) > citations[mid],说明我们要找的位置应该在中点的右边,即我们没有那么多引用次数超过(len - mid)的文章
代码如下:
class Solution { public: int hIndex(vector<int>& citations) { int left = 0, len = citations.size(), right = len-1; while(left <= right) { int mid = (left + right)/2; if(len-mid == citations[mid]) return citations[mid]; if(len-mid < citations[mid]) right = mid-1; else left = mid+1; } return len-left; } };