在排序数组中查找数字--剑指Offer(JAVA)

题目:
统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.
思路:
利用二分法找到该数字第一次出现的位置与最后一次出现的位置进而求得次数。具体做法:
利用middle=(start+end)/2,找到中间数字,并与目标数字比较,
1.中间数字大于目标数字,则将搜索范围缩小为start到middle-1
2.中间数字小于目标数字,将搜索范围缩小为middle+1到end
3.中间数字等于目标数字,此时分为找首次出现位置和最后一次出现位置。对于第一种,查看中间数字前一个是否不变,若变小则当前middle位置即为首次出现位置,否则缩小范围至start到middle-1。对于第二种,同理查看后一个数字是否相等,并作相应处理。
最后值得注意的是边界值,因为middle永远取不到初始start和end。因此对于首位和末位数字的次数要特别留意。

public class Solution {
    public  int getTimes(int num,int[] array){
        if (array.length==0||array[0]>num||array[array.length-1]<num)
            return -1;
        int start = GetFirstK(num,  array,0,array.length-1);
        int end = GetLastK(num,array,0,array.length-1);
        if (start==-1)
            return -1;
        return end+1-start;
    }
    public  int GetFirstK(int num,int[] array,int start ,int end){
        int pos = 0;
        if (array[0]==num)
            return 0;
        if (array.length==1)
        {
            if (array[0]==num)
                return 0;
            else return -1;
        }
        int middle = (start+end)/2;
        if (array[middle]<num&&middle==array.length-2)
            pos = GetFirstK(num, array, ++middle, end);
        if (array[middle]<num)
            pos = GetFirstK(num, array, middle, end);
        if (array[middle]>num)
            pos = GetFirstK(num, array, start, middle);
        if (array[middle]==num){
            if (middle==0||array[middle-1]!=num)
                pos =  middle;
            else
                pos = GetFirstK(num, array, start, middle);
        }
        return pos;
    }
    public static int GetLastK(int num,int[] array,int start ,int end){
        int pos = 0;
        if (array[end]==num)
            return end;
        if (array.length==1)
        {
            if (array[0]==num)
                return 0;
            else return -1;
        }
        int middle = (start+end)/2;
        if (array[middle]<num)
            pos = GetLastK(num, array, middle, end);
        if (array[middle]>num&&middle==1)
            pos = GetLastK(num, array, start, --middle);
        if (array[middle]>num)
            pos = GetLastK(num, array, start, middle);
        if (array[middle]==num){
            if (middle==array.length-1||array[middle+1]!=num)
                pos =  middle;
            else
                pos = GetLastK(num, array, middle, end);
        }
        return pos;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值