劍指offer:數字在排序數組中出現的次數

題目描述:數組

統計一個數字在排序數組中出現的次數。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 };
相關文章
相關標籤/搜索