剑指Offer-数字在排序数组中出现的次数

题目描述

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

解题思路—二分查找:不要拿到题目就想着循环遍历数组判断大小,一定要有这个意识,题目提到有序数列,就想到二分!通过二分查找找到数字在数组中的起始点和截止点,然后相减得到次数。编写代码的时候要注意二分查找数组的上下界start和end,是会随着每一次递归或者循环变化的!还有特别使用循环写二分查找时,要注意将中值middle放入循环中,要不然middle不会变!

Java解题—二分查找

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
       if(array.length==0)
            return 0;

        int firstK = getFirst(array, k,0, array.length-1);
        int lastK = getLast(array, k, 0, array.length-1);

        if(firstK!=-1 && lastK!=-1)
            return lastK-firstK+1;
        return 0;
    }
    
    public int getFirst(int[] array, int k, int start, int end){
        if(start>end)
            return -1;
        int middle = (start+end)/2;

        if(array[middle]>k)
            return getFirst(array, k, start, middle-1);
        else if(array[middle]<k)
            return getFirst(array, k, middle+1, end);
        else if(middle-1 >= start && array[middle-1]==k)  // 这里要注意是start,而不是0
            return getFirst(array, k, start, middle-1);
        else
            return middle;
    }
    
	// 使用循环
    public int getLast(int[] array, int k, int start, int end){
        if(start>end)
            return -1;
        
        while(start<=end){
            int middle = (start+end)/2; // middle要放入循环中
            if(array[middle]>k)
                end = middle - 1;
            else if(array[middle]<k)
                start = middle + 1;
            else if(middle+1<=end && array[middle+1]==k) // 这里要注意是end,而不是array.length
                start = middle + 1;
            else
                return middle;
        }
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值