Follow up for H-Index: What if the citations
array is sorted in ascending order? Could you optimize your algorithm?
思路:已经排好序,一定用二分法!一定用二分法!一定用二分法!这简直就是固定套路了.....
class Solution {
public int hIndex1(int[] citations) {//非二分法,复杂度O(N)
if(citations.length <= 0) return 0;
int h = 0;
//Arrays.sort(citations);
for(int i = 0 ; i < citations.length;i++){
while( h < citations.length){
if( citations.length - i > h && h < citations[i]) h++;//剩余的大于h,且h不超过当前位置
else break;
}
}
return h;
}
//既然已经有序,就应该考虑二分法!!!!!
public int hIndex(int[] citations) {//二分法,复杂度O(logN)
if(citations.length <= 0) return 0;
int len = citations.length;//剩余的未考察的元素长度
int count = len;//剩余待考察的长度,初值为len
int half = count / 2;
int first = 0;//二分搜索的起始位置,
while(count > 0)//仍有元素未被考察
{
half = count / 2;
int mid = first + half;
if(citations[mid] < len - mid){//剩余的元素足够支撑h = citations[mid]
//元素个数中包括了citations[mid]这个元素
first = mid + 1;
count -= (half + 1);
}else{//排除掉了一半元素
count = half;
}
}
return len - first;
}
}