题目:
统计一个数字在排序数组中出现的次数。
思路:
因为是排好序的数组,所以可以采用二分查找的算法。
一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在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 }
时间: 2024-10-26 20:08:51