【力扣】二分法

二分法常见条件:数组有序排列,数组内无重复元素,要求时间复杂度为O(logn)。

二分法常见题型:1、返回目标值对应的下标

                             2、将目标值插入到合适的位置

                             3、返回目标值的起始位置。

二分法解题思路:

   1.目标值不在数组中

目标值不是数组中的数字:利用数组有序性,目标值和数组的首尾数值进行比较,不在则返回-1.注意:此处要考虑空数组的存在

目标值在数组范围中,但数组中不含这个值,利用边界确定返回-1

    2.目标值在数组中

  • 确定左右边界

初始化左右边界,左边界为数组的起始下标--0;右边界为数组的尾下标--长度减1。左右边界均对应数组的下标。

  • 设置循环条件(即边界的范围)

        (优先左闭右闭的写法,除此之外还有左闭右开的写法)对于左闭右闭的写法,循环条件为left <= right, 在循环条件中设置中间值(每次循环更新中间值以及边界范围),中间值为{\color{DarkBlue}mid= }{\color{DarkBlue} \frac{right}{2}+left},常用 >> 来代替 /2 的操作,但有时候>>会超时。

        通过判断来更改边界范围:当数组下标mid对应的值小于目标值,又由于是左闭右闭,则目标值处于[mid+1,right]区间内,即将左边界赋值为mid+1。当数组下标mid对应的值大于目标值,则目标值处于[left,mid-1]区间内,即将右边界赋值为mid-1。当数组下标mid对应的值等于目标值,返回mid,即返回目标值对应的数组下标

1、返回目标值对应的下标

如上。由于目标值一定在数组中,所以 数组下标mid对应的值等于目标值 这一语句必定会被执行。故只在判断相等代码语句中加入返回值即可。

2、将目标值插入到合适的位置

当目标值可以被返回下标时,如题1。但当数组中没有目标值要返回插入位置的下标时,判断相等的语句一定不会执行。此时只有 数组下标mid对应的值大于目标值 或 数组下标mid对应的值小于目标值 两种情况。

当数组有序时,会出现nums[mid]>target ,此时的mid即为要返回的值。由于mid在循环条件中定义,所以定义一个辅助的变量存mid的值,在不满足进循环时返回。

当nums[mid]<target时,会更新左边界值,所以不需要返回值。

3、返回目标值的起始位置

利用两次二分法分别找起始点和终止点。找右边界时赋left值,找左边界赋right值,且最后的范围为【左+1,右-1】。

return new int[ ]{leftrange+1,rightrange-1}

4、x的平方根、有效的完全平方数

思路类似,先设置左右边界。中点值即为所求的值,循环条件同上,但是判断条件是中点值的平方和x进行比较,然后更改边界。注:mid*mid的类型应该提升到long,否则超时。求平方时一定要考虑到数字很大的情况,提前提升类型到long。否则必会超时。

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值