数字在排序数组中出现的次数(C++)

题目:

统计一个数字在排序数组中出现的次数

思路:

因为是排序数组,所以重复的数字都连着排列,因此只需要找到第一个出现的位置和最后一次出现的位置即可,可用二分法实现,复杂度为O(logn)

代码实现:

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int len = data.size();
        int result = 0;
        if(len > 0)
        {
            int first = Getfirst(data, k, 0, len - 1);
            int last = Getlast(data, k, len, 0, len - 1);
            if(first > -1 && last > -1)
                result = last - first + 1;
        }
        return result;
    }
    /*---查找第一个k出现的位置---*/
    int Getfirst(vector<int> data, int k, int start, int end)
    {
        if(start > end)
            return -1; // 如果没有则返回-1
        int mid = (start + end) / 2;
        if(data[mid] == k)
        {
            if((mid > 0 && data[mid - 1] != k) || mid == 0)
                return mid; // 如果当前时最左边的元素或者其左边的元素不是k则表明该位置为k首次出现的位置
            else
                end = mid - 1;
        }
        else if(data[mid] < k)
            start = mid + 1;
        else
            end = mid - 1;
        return Getfirst(data, k, start, end);
    }
    /*---查找最后一个k出现的位置---*/
    int Getlast(vector<int> data, int k, int len, int start, int end)
    {
        if(start > end)
            return -1;
        int mid = (start + end) / 2;
        if(data[mid] == k)
        {
            if((mid < len - 1 && data[mid + 1] != k) || mid == len - 1)
                return mid;
            else
                start = mid + 1;
        }
        else if(data[mid] < k)
            start = mid + 1;
        else
            end = mid - 1;
        return Getlast(data, k, len, start, end);
    }
};
发布了63 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Jerry_Leo_liu/article/details/105287693