剑指offer-面试题38 : 数字在排序数组中出现的次数

来源:互联网 发布:剑罗数据 编辑:程序博客网 时间:2024/06/03 09:45
//如果直接遍历数组,则时间复杂度是O(n);//如果用二分法分别找出第一次出现的位置和最后一次的位置,再相减,时间复杂度就是O(log(n));#include<iostream>using namespace std;int GetFirstK(int Array[], int length, int K, int start, int end){    if(Array == NULL || length <= 0 || start<0 || end<0 || start>end)        return -1;    int mid = (start+end)/2;    int midData = Array[mid];    if(midData == K)    {        if((mid > 0  && Array[mid-1] < K) || mid == 0)            return mid;        else            return GetFirstK(Array, length, K, start, mid-1);    }    else if(midData > K)    {        return GetFirstK(Array, length, K, start, mid-1);    }    else    {        return GetFirstK(Array, length, K, mid+1, end);    }}int GetLastK(int Array[], int length, int K, int start, int end){    if(Array == NULL || length <= 0 || start<0 || end<0 || start>end)        return -1;    int mid = (start+end)/2;    int midData = Array[mid];    if(midData == K)    {        if((mid < length-1  && Array[mid+1] > K) || mid == length-1)            return mid;        else            return GetLastK(Array, length, K, mid+1, end);    }    else if(midData > K)    {        return GetLastK(Array, length, K, start, mid-1);    }    else    {        return GetLastK(Array, length, K, mid+1, end);    }}int GetNumberOfK(int Array[], int length, int K){    if(Array == NULL || length <= 0)        return -1;    int first = GetFirstK(Array, length, K, 0, length-1);    int last = GetLastK(Array, length, K, 0, length-1);    if(first > -1 && last > -1)        return last-first+1;    else        return 0;}int main(){    int a[]={1,2,3,3,3,3,4,4,5,6,7};    cout<<GetNumberOfK(a, 10, 4)<<endl;}
0 0
原创粉丝点击