統計一個數組在排序數組中出現的次數,C++,二分查找


在排序數組中查找很容易想到的就是二分查找,這樣的查找效率是相當高的。

找到之后,再在這個數的周圍向左或者向右進行延伸,查找有多少個相同的數字。

這次編程主要遇到的問題就是,對二分查找的要點已經忘得差不多了,所以特意寫個博客記錄。

這個數組中本身含有想要查找的數字很簡單,設定三個值,left,middle,right。如果array【middle】>k,就更新right=middle。類似的查找,可以看下面的代碼。

難點在於,數組中並沒有想要查找的數字,這時候就要分情況討論

一、要查找的數字比所有的數字都小

二、要查找的數字比所有的數字都大

三、要查找的數字在范圍內,但是卻沒有這個數字。這時候,根據上面的查找算法,加入說,要查找7這個數字,數組內部是{6,8};這時候

1)array[left] = 6,array[right] = 8;middle = (left + right)/2.所以array[middle]=6(middle 等於 left);

這時候array[middle]<7,按照算法,應該left=middle,但是這樣的話就會陷入死循環。所以應該判斷當left=middle的時候,不進行賦值,退出;

2)同樣是查找7這個數字,但是數組是{6,8,9};

這時候array[middle]=8>7,right賦值為middle,接着陷入之前的境地。

代碼如下:

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 class Solution {
 5 public:
 6     int GetNumberOfK(vector<int> data ,int k) {
 7         if (data.size() == 0 || data[0] > k || data[data.size() - 1] < k)
 8         {
 9             return 0;
10         }
11         int left = 0;
12         int right = data.size();
13         int middle = (left + right)/2;
14         while (true)
15         {
16             if (data[middle] == k)
17             {
18                 break;
19                 //如果中間數比k還大的話,就應該去小的一部分數字中尋找 
20             } else if (data[middle] > k) {
21                 right = middle;
22             } else {
23                 if (left == middle)
24                 {
25                     return 0;
26                 }
27                 left = middle;
28             }
29             middle = (left + right) /2;
30         }
31         left = middle - 1;
32         right = middle + 1;
33         int count = 1;
34         while (left >= 0 && data[left--] == k)
35         {
36             count++;
37         }
38         while (right < data.size() && data[right++] == k)
39         {
40             count++;
41         }
42         return count;
43     }
44 };
45 int main()
46 {
47     int array[6] = {3,3,3,3,4,5};
48     vector<int> vec(array, array + 6);
49     cout<<Solution().GetNumberOfK(vec, 3)<<endl;
50     return 0;
51 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM