二分查找的变形,统计数字在排序数组出现的次数
当在排序数组中查找数字时,首选的方法为二分查找法
1 class Solution { 2 public: 3 int GetFirstK(vector<int>data,int k,int start,int end) 4 { 5 if(start>end) 6 return -1; 7 int middle=(start+end)/2; 8 int middledata=data[middle]; 9 if(middledata==k) 10 { 11 if((middle>0&&data[middle-1]!=k)||middle==0)//当midlle的左边没有k了,此时middle的位置为第一个k的位置 12 return middle; 13 else 14 end=middle-1;//否则应该从start到middle-1重新查找 15 } 16 else if(middledata>k) 17 end=middle-1; 18 else 19 start=middle+1; 20 return GetFirstK(data,k,start,end); 21 22 } 23 int GetLastK(vector<int>data,int k,int start,int end) 24 { 25 if(start>end) 26 return -1; 27 int middle=(start+end)/2; 28 int middledata=data[middle]; 29 if(middledata==k) 30 { 31 if((middle<data.size()&&data[middle+1]!=k)||middle==data.size()-1)//当middle的右边没有k是,此时的middle就是最后一个k 32 return middle; 33 else 34 start=middle+1;//否则要从middle+1查找 35 } 36 else if(middledata>k) 37 end=middle-1; 38 else 39 start=middle+1; 40 return GetLastK(data,k,start,end); 41 42 } 43 int GetNumberOfK(vector<int> data ,int k) { 44 /*int len=data.size(); 45 if(len==0) return 0; 46 47 int count=0; 48 for(int i=0;i<data.size();i++) 49 { 50 if(data[i]==k) count++; 51 } 52 return count;*/ 53 int number=0; 54 if(data.size()>0) 55 { 56 int first=GetFirstK(data,k,0,data.size()-1); 57 int last=GetLastK(data,k,0,data.size()-1); 58 if(first>-1&&last>-1) 59 number=last-first+1; 60 } 61 return number; 62 } 63 };