37.数字在排序数组出现的次数

题目描述:

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

思路分析:

  由题目知道这道题是属于排序数组中的查找问题,那么我们首先想到的就是二分查找。由于要在排序数组中找一个数字出现的次数,那么我们只要确定这个数字第一次出现的地方和最后一个出现的位置那么我们就可以算出它在数组出现的次数。二分查找算法首先拿数组的中间数字和K作比较,如果中间的数比K大,那么我们下一轮只需要在前半段进行查找。如果比K小,那我们在后半段进行查找。如果等于K那我们要判断这个K是不是第一个K,那么我们就需要看前一个数字是不是K,如果不是那么中间数就是第一个K,如果前一个数字是K,那么第一个K肯定在数组的前段,下一阶段我们就在前半段进行查找。同样的要找最后一个K首先拿数组的中间数字和K作比较,如果中间的数比K大,那么我们下一轮只需要在前半段进行查找。如果比K小,那我们在后半段进行查找。如果等于K那我们要判断这个K是不是最后一个K,那么我们就需要看后一个数字是不是K,如果不是那么中间数就是最后一个K,如果后一个数字是K,那么最后一个K肯定在数组的后半段,下一阶段我们就在后半段进行查找。

代码:

public class Test{
    public int GetNumberOfK(int []nums,int K){
        if(nums.length==0||nums==null)
            return 0;
        int first=GetFirstK(nums,0,nums.length-1, K);
        int last=GetLastK(nums,0,nums.length-1,K);
        if(first>-1&&last>-1){
            return last-first+1;
        }
            return 0;

    }
    public int GetFirstK(int []nums,int start,int end,int k){
        if(start>end)
            return -1;
        int mid=(start+end)/2;
        int midnum=nums[mid];
        if(midnum==k){
            if(mid>0&&nums[mid-1]!=k||mid==0)
                return mid;
            else
                end=mid-1;
        }else if(midnum>k){
            end =mid-1;
        }else{
            start=mid+1;
        }
        return GetFirstK(nums,start,end,k);
    }
    public int GetLastK(int[]nums,int start,int end,int k){
        if(start>end)
            return -1;
        int mid=(start+end)/2;
        int midnum=nums[mid];
        if(midnum==k){
            if(mid<nums.length-1&&nums[mid+1]!=k||mid==nums.length-1)
                return mid;
            else
                start=mid+1;
        }else if(midnum>k){
            end=mid-1;
        }else{
            start=mid+1;
        }
        return GetLastK(nums,start,end,k);
    }
原文地址:https://www.cnblogs.com/yjxyy/p/10846840.html