LC 69.x的平方根

文章介绍了如何用Java编程解决计算非负整数x的算术平方根问题,利用二分搜索方法避免暴力循环的效率问题,通过if判断处理溢出,并返回满足要求的整数结果。解决方案展示了高效的O(logx)时间复杂度和O(1)空间复杂度。
摘要由CSDN通过智能技术生成

x的平方根

给你一个非负整数 x ,计算并返回 x算术平方根

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意: 不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 2^31 - 1

解题

解法一

思路分析:

  1. 根据题目提示,x的范围在0 <= x <= 2^31-1,如果是暴力循环遍历求解寻找平方根,会超时,所以我们考虑使用二分来搜索平方根。
  2. 使用二分时,我们需要考虑if判断条件,同时我们可以根据算术平方根的性质有x = a*a, a >= 2, a*a/2 > a即二分搜索的终点可以缩减为x/2

实现代码如下:

class Solution {
    public int mySqrt(int x) {
       if (x == 0 || x == 1)     // 若x为1或2则算术平方根为x本身直接返回即可
            return x;
        // 当 x >= 2时 由算数平方根的性质可以得出 x的算术平方根a 一定 < x/2
        int end = x / 2;
        // 使用二分来搜索
        int start = 1;
        while (start < end) {
            int mid = ((end - start) >> 1) + start;
            if ((long)mid * mid > x) {
                end = mid;
            } else {
                start = mid + 1;
            }
        }
        // 返回结果刚好是x的算术平方根的两边整数端点
        // 根据题意返回左端点
       if (start*start > x) start -= 1;
       return start;
    }
}

提交结果如下:

解答成功:
    执行耗时:1 ms,击败了94.10% 的Java用户
    内存消耗:39.1 MB,击败了5.01% 的Java用户

复杂度分析:

  • 时间复杂度:O(log x)
  • 空间复杂度:O(1)

总结:

if判断中,mid*mid会导致溢出,因此需要将类型改为long,同时返回值有可能是在x算术平方根的两边端点,需要返回更小的端点

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值