数字在排序数组中出现的次数
题目描述
统计一个数字在排序数组中出现的次数
思路:用二分法分别查找数字在数组中出现的开头和结尾的位置,次数=结尾-开头+1,时间复杂度为O(logn)
1 int getFirstK(vector<int> &data, int k) 2 { 3 int begin=0; 4 int end=data.size()-1; 5 while(begin<=end) 6 { 7 int mid=(begin+end)/2; 8 if(data[mid]>k)end=mid-1; 9 else if(data[mid]<k)begin=mid+1; 10 else{ 11 if(mid==0 || data[mid-1]!=k)return mid; 12 end=mid-1; 13 } 14 } 15 return -1; 16 } 17 int getLastK(vector<int> &data, int k) 18 { 19 int begin=0; 20 int end=data.size()-1; 21 while(begin<=end) 22 { 23 int mid=(begin+end)/2; 24 if(data[mid]>k)end=mid-1; 25 else if(data[mid]<k)begin=mid+1; 26 else{ 27 if(mid==data.size()-1 || data[mid+1]!=k)return mid; 28 begin=mid+1; 29 } 30 } 31 return -1; 32 } 33 int GetNumberOfK(vector<int> data ,int k) { 34 if(data.size()==0)return 0; 35 int left=getFirstK(data, k); 36 int right=getLastK(data, k); 37 if(left==-1 || right==-1)return 0; 38 return right-left+1; 39 }