码迷,mamicode.com
首页 > 编程语言 > 详细

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

时间:2015-09-03 10:19:58      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:

题目:

统计一个数字在排序数组中出现的次数。

思路:

因为是排好序的数组,所以可以采用二分查找的算法。

一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在n个数组中还可能有n个k,所以

查找的复杂度还是O(n)

可以先用二分查找算法找到第一个出现的位置,即当找到一个时,看它前面一个是否也是k或者是否已经是查找这段的第一个了

然后同样用二分查找找最后一个出现的位置。

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 int count_number(vector<int>& vec,int n)
 6 {
 7     if(vec.empty())
 8         return 0;
 9     int len=vec.size();
10     int re=0;
11     int i=0;
12     int j=len-1;
13 
14     int re1=0;
15     while(1)
16     {
17         if(i==j)
18         {
19             if(vec[i]==n)
20             {re1=i;break;}
21             else
22                 return 0;
23         }
24         int k=(j+i)/2;
25 
26         if(vec[k]==n)
27         {
28             if(k==i)
29             {re1=k;break;}
30             if(vec[k-1]!=n)
31             {re1=k;break;}
32             j=k-1;
33         }
34         else if(vec[k]<n)
35         {
36             i=k+1;
37         }
38         else
39             j=k-1;
40     }
41 
42     cout<<"re1="<<re1<<endl;
43 
44     int re2=0;
45     i=0;
46     j=len-1;
47     while(1)
48     {
49         if(i==j)
50         {
51             if(vec[i]==n)
52             {re2=i;break;}
53             else
54                 return 0;
55         }
56         int k=(j+i)/2;
57 
58         if(vec[k]==n)
59         {
60             if(k==j)
61             {re2=k;break;}
62             if(vec[k+1]!=n)
63             {re2=k;break;}
64             i=k+1;
65         }
66         else if(vec[k]<n)
67         {
68             i=k+1;
69         }
70         else
71             j=k-1;
72     }
73     cout<<"re2="<<re2<<endl;
74     re=re2-re1+1;
75     return re;
76 }
77 
78 int main()
79 {
80     int ary[8]={1,2,3,3,3,3,4,5};
81     vector<int> vec(ary,ary+8);
82 
83     cout<<count_number(vec,3)<<endl;
84     system("pause");
85 }

 

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4779931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!