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

来源:互联网 发布:仿真画笔手绘软件 编辑:程序博客网 时间:2024/05/16 14:04

题目

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

思路1

有序数组,二分查找,得到连续所求数的某一个位置
根据所求位置上下取限

public int GetNumberOfK(int [] array , int k) {        if(array==null||array.length==0)            return 0;        int lo=0, hi=array.length-1;        if(array[0]==k&&array[hi]==k)            return hi+1;       int mid = 0;       while(lo<=hi){     //二分查找           mid = (lo+hi)/2;           if(array[mid]<k) lo=mid+1;           else if(array[mid]>k) hi=mid-1;           else lo = hi+1;       }       if(array[mid]!=k)            return 0;       while(array[mid]==k&&mid<hi)           mid++;        int i = array[hi]==k?hi:--mid;        while(array[mid]==k&&mid>0)            mid--;        return array[0]==k?(i-mid+1):(i-mid);    }

思路2

二分查找获取上下限位置

链接:https://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2来源:牛客网//因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5//这两个数应该插入的位置,然后相减即可。class Solution {public:    int GetNumberOfK(vector<int> data ,int k) {        return biSearch(data, k+0.5) - biSearch(data, k-0.5) ;    }private:    int biSearch(const vector<int> & data, double num){        int s = 0, e = data.size()-1;              while(s <= e){            int mid = (e - s)/2 + s;            if(data[mid] < num)                s = mid + 1;            else if(data[mid] > num)                e = mid - 1;        }        return s;    }};