1. 程式人生 > >(C++)劍指offer-37:數字在排序陣列中出現的次數(知識遷移能力)

(C++)劍指offer-37:數字在排序陣列中出現的次數(知識遷移能力)

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

目錄

1問題描述

統計一個數字在排序陣列中出現的次數。
這裡寫圖片描述

2問題答案

看見有序,肯定就是二分查找了,演算法比較簡單,不多說

值得一提的是,不要拘泥於遞迴,要會迴圈寫法。

class Solution {
    /*二分查詢 找到第一個K 和 最後一個K 二者位置相減*/
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.empty())
            return 0;
        int number = 0
; int first = GetFirstIndex(data,k,0,data.size()-1); int last = GetLastIndex(data,k,0,data.size()-1); if(first>-1 && last>-1) number = last - first +1; return number; } int GetFirstIndex(vector<int> &data,int k,int start,int
end){ if(start > end) return -1; int mid = start+(end-start)/2; if(data[mid] == k){ if((mid == start) || (data[mid-1] != k)) return mid; else end = mid-1; } else{ if(data[mid] > k) end = mid - 1
; else start = mid + 1; } return GetFirstIndex(data,k,start,end); } int GetLastIndex(vector<int> &data,int k,int start,int end){ if(start > end) return -1; int mid = start+(end-start)/2; if(data[mid]==k){ if((mid == end) || (data[mid+1] != k)) return mid; else start = mid +1; } else{ if(data[mid]>k) end = mid-1; else start = mid+1; } return GetLastIndex(data,k,start,end); } };

3完整程式碼

#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.empty())
            return 0;
        int number = 0;
        int first = GetFirstIndex(data,k,0,data.size()-1);
        int last = GetLastIndex(data,k,0,data.size()-1);
        if(first>-1 && last>-1)
            number = last - first +1;
        return number;
    }

    int GetFirstIndex(vector<int> &data,int k,int start,int end){
        if(start > end)
            return -1;
        int mid = start+(end-start)/2;

        if(data[mid] == k){
            if((mid == start) || (data[mid-1] != k))
                return mid;
            else
                end = mid-1;
        }
        else{
            if(data[mid] > k)
                end = mid - 1;
            else
                start = mid + 1;
        }
        return GetFirstIndex(data,k,start,end);
    }
    int GetLastIndex(vector<int> &data,int k,int start,int end){
        if(start > end)
            return -1;
        int mid = start+(end-start)/2;

        if(data[mid]==k){
            if((mid == end) || (data[mid+1] != k))
                return mid;
            else
                start = mid +1;
        }
        else{
            if(data[mid]>k)
                end = mid-1;
            else
                start = mid+1;
        }
        return GetLastIndex(data,k,start,end);
    }
};

int main()
{
    cout<<"number of K : "<<endl;
    Solution s;
    vector<int> a={1,2,3,4,4,5,6,7,8,9,9,9,10};
    cout<<s.GetNumberOfK(a,9)<<endl;
}

number of K :
3