此题为求排序数组中指定数字出现过的次数
思路一:利用二分查找,先找到排序数组中的某一个指定数字,然后向两边扩展查找
思路二:利用二分查找,分别找到第一次出现该数字的下标以及最后一次出现该数字的下标,times=right-left+1
代码如下:
class Solution {
public:
int GetMinIndex(vector<int> & data,int k,int start,int end)
{
if(start==end)
return start;
if(start==0&&data[start]==k)
return start;
if(start>0&&data[start-1]<k&&data[start]==k)
return start;
if(start+1==end)
{
if(data[start]==k)
return start;
else
return end;
}
int mid=start+(end-start)/2;
if(data[mid]<k)
return GetMinIndex(data,k,mid+1,end);
else
return GetMinIndex(data,k,start,mid);
}
int GetMaxIndex(vector<int> & data,int k,int start,int end)
{
if(start==end)
return start;
if(end==data.size()-1&&data[end]==k)
return end;
if(end<data.size()-1&&data[end+1]>k&&data[end]==k)
return end;
if(start+1==end)
{
if(data[end]==k)
return end;
else
return start;
}
int mid=start+(end-start)/2;
if(data[mid]>k)
return GetMaxIndex(data,k,start,mid-1);
else
return GetMaxIndex(data,k,mid,end);
}
int GetNumberOfK(vector<int> data ,int k) {
int result=0;
int len=data.size();
if(len<1)
return result;
if(k<data[0]||k>data[len-1])
return result;
int left=GetMinIndex(data,k,0,len-1);
int right=GetMaxIndex(data,k,0,len-1);
result=right-left+1;
return result;
}
};