剑指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 };
相关文章
相关标签/搜索