面试题53:在排序数组中查找数字

一、题目

     统计一个数字在排序数组中出现的次数,例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.

二、解法

思路:既然输入的数组是排序的,那么我们自然能想到用二分查找算法,如何高效的利用二分查找,可以分别利用二分查找找到第一个k和最后一个k。

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int number = 0;
        int length = data.size();
        if(length>0)
        {
            int first = GetFirstK(data, k, 0, length-1);
            int last = GetLastK(data, k, 0, length-1);
            if(first>-1 && last>-1)
                number = last-first+1;
        }
        return number;
    }
    int GetFirstK(vector<int> data, int k, int start, int end)
    {
        int length = data.size();
        if(start > end)
            return -1;
        int middleIndex = (start + end)/2;
        int middleData = data[middleIndex];
        if(middleData==k)
        {
            if((middleIndex>0 && data[middleIndex-1]!=k) || middleIndex==0)
                return middleIndex;
            else
                end = middleIndex-1;
        }
        else if(middleData>k)
            end = middleIndex-1;
        else
            start = middleIndex+1;
        return GetFirstK(data, k, start, end);
    }
    int GetLastK(vector<int> data, int k, int start, int end)
    {
        int length = data.size();
        if(start > end)
            return -1;
        int middleIndex = (start+end)/2;
        int middleData = data[middleIndex];
        if(middleData==k)
        {
            if((middleIndex<length-1&&data[middleIndex+1]!=k) || middleIndex==length-1)
                return middleIndex;
            else
                start = middleIndex+1;
        }
        else if(middleData<k)
            start = middleIndex+1;
        else
            end = middleIndex-1;
        return GetLastK(data, k, start, end);
    }
};


猜你喜欢

转载自blog.csdn.net/sinat_36161667/article/details/81046752