1. 程式人生 > >劍指offer 37 數字在排序陣列中出現的次數

劍指offer 37 數字在排序陣列中出現的次數

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;
    }*/
}