【Java算法之二分查找】

Java算法之二分查找
简单讲一下二分查找的工作原理:
图片来自《算法题解》一书;
举个例子:

我随便想一个1~100的数字。在这里插入图片描述你的目标是以最少的次数猜到这个数字;你每次猜完,我都会说大了、小了或对了。
假设你从1开始猜,过程会是这样。在这里插入图片描述这是简单查找,就是傻找,每次猜测只能排除一个数字,若我想的数是n,你得猜n次。

下面是更佳的猜法即二分查找
从50开始在这里插入图片描述小了,但排除了一半数字;至此,你知道1~50都小了。因此,下一步你猜75。在这里插入图片描述大了,那余下的数字又排除了一半;使用二分查找时,你猜测的是中间的数,从而每次都将 余下的数排除一半,在这里插入图片描述
这就是二分查找。对于包含n个元素的列表,二分查找最多需要log2n步,而简单查找最多需要n步。

直接上例题:

二分查找入门:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:
输入:x = 4
输出:2
/
示例 2:
输入:x = 8
输出:2
/
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
来源:力扣(lLeetCode)

题解思路:
终止条件:left>right
向左查找:right=mid-1
向右查找:left=mid+1
中间值:mid = low + (high - low) / 2;(mid = ( low + high ) / 2有可能会发生数据溢出;举个例子:假如数据储存范围为0~250,那么执行 ( low + high ) 时已经超出范围了。)

import java.util.Scanner;
public class newText2 {
    public static void main(String[] args) {
        System.out.print("请输入:x=");
        Scanner mc = new Scanner(System.in);
        int x = mc.nextInt();
        System.out.print("输出:");
        System.out.println(mySqrt(x));
    }

    static int mySqrt(int x) {
        if (x == 0 || x == 1) return x;//0或1是特殊情况,直接返回原值
        int low = 1;
        int high = x;
        int mid;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (mid > x / mid) {
                high = mid - 1;
            } else if (mid < x / mid) {
                low = mid + 1;
            } else {
                return mid;
            }
        }
        return high;
    }
}

最后为什么不满足 while (low <= high )条件后,要返回high或low-1,以8的算术平方根为例:
第一步:

12345678
lowmidhigh

low = 1 ; high = 8 ;
mid= low + (high - low) / 2 = 4 ; mid > 8/ mid ;执行 high = mid - 1=3;

12345678
lowhigh

第二步:

12345678
lowmidhigh

low = 1 ; high = 3 ;
mid = low + (high - low) / 2 = 2 ; mid < 8/ mid ;执行 low = mid + 1=3;
此时 low = high = 3

12345678
midlow=high=3

第三步:

12345678
low=high=mid=3

low = high = mid = 3;
mid= low + (high - low) / 2 = 3 ; mid > 8/ mid ;执行 high = mid -1 = 2 ;

12345678
mid=highlow

由图可见,此时 low >high ; 已经不满足 while (low <= high )条件;应返回 high 或 low -1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值