題目描述:數組
統計一個數字在排序數組中出現的次數。spa
思路分析:code
1. 直觀思路是直接遍歷一遍,統計。複雜度也只要O(n)。blog
2. 顯然這道題要考察的內容不這麼簡單,實際上考慮二分的思想來完成。分別二分查找第一個k和最後一個k。具體來講,利用二分查找思想,找到k,再判斷當前的前一個是否爲k或是否爲第一個元素,如果,則返回;不然即第一個k在前面,則右邊界r左移,繼續遞歸查找。對於最後一個k的查找思路相似。排序
代碼:遞歸
思路二:io
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 };