劍指offer 37 數字在排序陣列中出現的次數
阿新 • • 發佈:2018-12-30
1 遍歷尋找
2 二分查詢法:
正常二分法
遞迴二分法
#include <iostream> #include <vector> using namespace std; class Solution { public: // 數字在排序陣列中出現的次數 //遍歷 int GetNumberOfK(vector<int> array, int k) { if (array.size() == 0) { return 0; } int count = 0; for (int i = 0; i < array.size(); i++) { if (array[i] == k) { count++; } } return count; } //二分法查詢 int GetNumberOfK2(vector<int> array, int k) { if (array.size() == 0) { return 0; } int index = BinarySearch( array, k); //int index = BinarySearch2(array, 0, array.size()-1, k); if (index == -1) { return 0; } //統計次數 int count = 1; for ( int j = index - 1; j >= 0; j-- ) { if (array[j] == array[index]) { count++; } } for ( int j = index + 1; j < array.size(); j++ ) { if (array[j] == array[index]){ count++; } } return count; } //二分法 int BinarySearch(vector<int> arr , int k) { int low = 0, high = arr.size()-1; int mid = 0; while (low < high) { int mid = low +(high - low)/2; if (arr[mid] == k) { return mid; } if (arr[mid] > k) { high = mid - 1; } if (arr[mid] < k) { low = mid + 1; } } return -1; } //二分法遞迴 int BinarySearch2(vector<int> arr, int begin ,int end, int k) { if (begin > end) { return -1; } int mid = begin + (end - begin)/2; if (arr[mid] == k) { return mid; } else if (arr[mid] > k) { return BinarySearch2(arr, begin, mid-1, k); // 遞歸回去 } else if (arr[mid < k]) { return BinarySearch2(arr, mid+1, end, k); // 遞歸回去 } } }; int main() { int a1[] = { 5, 7 , 6, 3, 4, 9, 8}; int a2[] = { 1, 2 , 4, 8, 8, 8, 9}; vector<int> vec(a2, a2 + 7); Solution s; cout << s.GetNumberOfK2(vec, 8) << endl; /*for (int i = 0; i < array.size(); i++) { cout << array[i] << endl; }*/ }