二分查找

二分查找应用于已经排好序

没有重复值得查找

    private static int[] arr = {1, 2, 3, 4, 5, 6, 7};

    public static int get(int key) {
        int lo = 0;
        int hi = arr.length - 1;
        while (lo <= hi) {  //此处必须包含等于
            int index = lo + ((hi - lo) >> 1);  //如果是右移运算符 必须括号括起来 lo + ((hi - lo) >> 1)
            if (arr[index] == key) {
                return index;
            }
            if (arr[index] < key) {
                lo = index + 1;
            }
            if (arr[index] > key) {
                hi = index - 1;
            }
        }
        return -1;
    }


    public static void main(String[] args) {
        System.out.println(get(3));
    }

有重复值得查找-查找重复值最后一个元素

/**
     * 有可能多张同面值实效日期不一样的劵,需要优先选择实效日期最近的劵
     * 找最后一个等于值
     * [1,3,3]  取第二个3
     *
     * @param key
     * @return
     */
    public static int lastEqualsKey(int [] states, int key) {
        int lo = 0;
        int length = states.length;
        int hi = length - 1;
        //此处必须包含等于
        while (lo <= hi) {
            //如果是右移运算符 必须括号括起来 lo + ((hi - lo) >> 1)
            int index = lo + ((hi - lo) >> 1);
            int denomination = states[index];
            if (denomination == key) {
                int idx = index;
                while (idx + 1 <= length) {
                    int amount = states[idx];
                    if (idx + 1 == length && amount == key) {
                        return idx;
                    }
                    if (amount < states[idx + 1] && amount == key) {
                        return idx;
                    }
                    idx++;
                }
                return index;
            }
            if (denomination < key) {
                lo = index + 1;
            }
            if (denomination > key) {
                hi = index - 1;
            }
        }
        return -1;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值