题目描述:
统计一个数字在排序数组中出现的次数。
思路分析:
1. 直观思路是直接遍历一遍,统计。复杂度也只要O(n)。
2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成。分别二分查找第一个k和最后一个k。具体来说,利用二分查找思想,找到k,再判断当前的前一个是否为k或是否为第一个元素,若是,则返回;否则即第一个k在前面,则右边界r左移,继续递归查找。对于最后一个k的查找思路类似。
代码:
思路二:
1 class Solution { 2 public: 3 int GetFirstK(vector<int>data, int k, int l, int r) 4 { 5 if(l>r) 6 return -1; 7 int mid = (l+r)/2; 8 if(data[mid]>k) 9 { 10 r = mid-1; 11 } 12 else if(data[mid]<k) 13 { 14 l = mid+1; 15 } 16 else 17 { 18 if((mid>0 && data[mid-1]!=k) || mid==0) 19 return mid; 20 else 21 r = mid-1; 22 } 23 return GetFirstK(data, k, l, r); 24 } 25 int GetLastK(vector<int>data, int k, int l, int r) 26 { 27 if(l>r) //递归出口 28 return -1; 29 int mid = (l+r)/2; 30 if(data[mid]>k) 31 { 32 r = mid - 1; 33 } 34 else if(data[mid]<k) 35 { 36 l = mid + 1; 37 } 38 else 39 { 40 if((mid<data.size()-1&&data[mid+1]!=k) || mid == data.size()-1 ) 41 return mid; 42 else 43 l = mid+1; 44 } 45 return GetLastK(data, k, l, r); 46 } 47 int GetNumberOfK(vector<int> data ,int k) { 48 if(data.size()<=0) 49 return 0; 50 int first = GetFirstK(data, k, 0, data.size()-1); 51 int last = GetLastK(data, k, 0, data.size()-1); 52 if(first==-1 && last ==-1) 53 return 0; 54 else 55 return last-first+1; 56 } 57 };