数字在排序数组中出现的次数

来源:互联网 发布:如何提高淘宝店铺流量 编辑:程序博客网 时间:2024/06/10 07:14

二分查找算法可以用来在排序数组中快速查找一个数字。

题目描述

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

算法:
最简单的算法o(n)
因为题目是排序数组,所以自然想到二分查找算法。
第一轮,找到指定数字第一次出现的位置。找到指定数字后,要判断前边的数字是不是k,如果不是则说明这个位置的k是第一次出现的,如果仍然是k则继续向前寻找。
第二轮,找到指定数字最后一次出现的位置。找到k后,要判断后边的数字是不是k,如果不是说明这是最后一个k的位置,如果仍然是,则继续向后寻找。
找到两个位置后,相减就是结果。在找第一个或最后一个的时候要小心数组的边界,防止溢出。

class Solution {public:    //查找第一个出现的位置    int GetFirstK(vector<int>data,int start,int end,int k){        if(start > end)            return -1;        int mid = (start + end) /2;        if(data[mid] == k){            if((mid == 0) || (mid > 0 && data[mid-1] !=k))                return mid;            else                end = mid - 1;        }        else if(data[mid] > k)            end = mid - 1;        else            start = mid + 1;        return GetFirstK(data,start,end,k);    }    //查找最后一次出现的位置    int GetLastK(vector<int>data,int start,int end,int k){        if(start > end)            return -1;        int mid = (start + end )/2;        if(data[mid] == k){            int size = (int)data.size()-1;            if((mid == size)||(mid < size + 1 && data[mid+1] !=k))                return mid;            else                start = mid + 1;        }        else if(data[mid]>k)            end = mid - 1;        else            start = mid + 1;        return GetLastK(data,start,end,k);    }    int GetNumberOfK(vector<int> data ,int k) {        if(data.size() == 0)            return 0;        int size = (int)data.size()-1;        int start = GetFirstK(data,0,size,k);        int end = GetLastK(data,0,size,k);        if(start!=-1 && end !=-1)            return (end - start +1);        else            return 0;    }};
0 0
原创粉丝点击