算法019—— x的平方根

力扣—— x 的平方根(点击跳转)
在这里插入图片描述
当 x = 17 时,返回 4,我们发现此时 4 的平方根小于 x
当 x = 36 时,返回 6,我们发现此时 6 的平方根等于 x
在这里插入图片描述
根据这个我们可以找到题中的 二段性

我们定义一个变量 ret 表示最终结果,最终结果会将整个数组划分成两个区域在这里插入图片描述
因此我们可以使用二分查找来解决问题
在这里插入图片描述
mid 的平方在哪个区间内,有两种情况

  1. mid * mid <= x,此时应该在右边寻找,移动 left ,让 left = mid,不能等于 mid+1,因为 mid 的位置可能是 ret ,如果等于 mid + 1,会错过
    在这里插入图片描述
  2. mid * mid> x,此时应该在左边寻找,让 right = mid - 1
    在这里插入图片描述
    注意:
  • 当 x < 1 时,我们直接返回 0 即可
  • 由于 mid * mid 数据太大,有可能溢出,所以它的类型我们定义为 long,所以 left 与 right 的类型也定义为 long,最后返回的时候要注意强转

代码如下

class Solution {
    public int mySqrt(int x) {
        if(x < 1) return 0;
        long left = 1;
        long right = x;
        while(left < right){
            long mid = left + (right - left + 1) / 2;
            if(mid * mid <= x){
                left = mid;
            }else{
                right = mid - 1;
            }
        }
        return (int)left;
    }
}

easy
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值