两次AC,第一次问题依旧出现在对分时停止的条件上,以后要注意这种对分的写法,要当区间长度为1时就停止,然后对区间情况进行判断,这样不容易出错。
class Solution { public: void count(int& count1,int& count2,int h,vector<int>& citations) { for(int i=0;i<citations.size();i++) { if(citations[i]>=h) count1++; if(citations[i]<=h) count2++; } return; } int hIndex(vector<int>& citations) { int maxCite=0; for(int i=0;i<citations.size();i++) maxCite=max(maxCite,citations[i]); int N=citations.size(); int leftH=0; int rightH=maxCite; while(rightH-leftH>1) { int h=leftH+(rightH-leftH)/2; int count1=0; int count2=0; count(count1,count2,h,citations); if(count1>=h&&count2>=N-h) leftH=h; else if(count1>=h&&count2<N-h) leftH=h+1; else if(count1<h&&count2>=N-h) rightH=h-1; else//impossible {} } if(leftH==rightH) return leftH; else { int count1=0; int count2=0; count(count1,count2,rightH,citations); if(count1>=rightH&&count2>=N-rightH) return rightH; else return leftH; } } };