二分查找相关

建议使用V2
https://www.bilibili.com/video/BV1AP41137w7/?spm_id_from=333.788&vd_source=88184dae257eecf4353eecdafc614dd4

// nums 非递减的,即nums[i] <= nums[i+1]
    // 返回最小的满足 nums[i] >= target 的 i
    // 如不存在,返回len(nums)
    private int lowerBoundV1(int[] nums, int target) {
        int lo = 0;
        int hi = nums.length-1;

        while (lo <= hi) {
            int mid = lo + (hi - lo) / 2;

            if (nums[mid] < target) { // 红色;[L, M]都是红色;
                lo = mid + 1;         // L-1始终是红色
            } else {                  // 蓝色;[M,R]都是蓝色;
                hi = mid - 1;         // R+1始终是蓝色
            }
        }
        return  hi+1; // lo
    }

    private int lowerBoundV2(int[] nums, int target) {
        int lo = 0;
        int hi = nums.length;

        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;

            if (nums[mid] < target) { // < target 红色;[L, M]都是红色;
                lo = mid + 1;
            } else {                  // >= target 蓝色;[M,R)都是蓝色;
                hi = mid;
            }
        }
        return  hi; // lo
    }

    private int lowerBoundV3(int[] nums, int target) {
        int lo = -1;
        int hi = nums.length;

        while (lo+1 < hi) {
            int mid = lo + (hi - lo) / 2;

            if (nums[mid] < target) { // < target 红色;(L, M]都是红色;
                lo = mid;
            } else {                  // >= target 蓝色;[M,R)都是蓝色;
                hi = mid;
            }
        }
        return  hi;
    }

leetcode

    1. 寻找旋转排序数组中的最小值
    1. 寻找旋转排序数组中的最小值 II
    1. 搜索旋转排序数组
    1. 搜索旋转排序数组 II
    1. 在排序数组中查找元素的第一个和最后一个位置
    1. 寻找峰值
    1. 山脉数组的峰顶索引

红蓝染色 [lo, hi)

  • mid所处位置,mid在target左侧 是在红色,mid在target位置,或者是右侧,则是蓝色。
  • 如果是红色,则 [lo, mid] 都是红色,如果是蓝色,则[mid, hi) 都是蓝色。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值