在排序數組中查找很容易想到的就是二分查找,這樣的查找效率是相當高的。
找到之后,再在這個數的周圍向左或者向右進行延伸,查找有多少個相同的數字。
這次編程主要遇到的問題就是,對二分查找的要點已經忘得差不多了,所以特意寫個博客記錄。
這個數組中本身含有想要查找的數字很簡單,設定三個值,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 }
