算法—求x的平方根,只保留整数部分(Java)

这篇博客介绍了如何利用二分查找算法来计算非负整数的算术平方根,避免使用内置的指数函数。作者在解决LeetCode的第69题时,首先尝试直接计算平方导致超时,然后改用封装的方法计算平方,成功通过了测试。代码中展示了两种不同的二分法实现,最后强调了在处理可能越界的平方运算时,使用long类型以防止溢出。
摘要由CSDN通过智能技术生成

需求

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

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

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

(leetcode.69)

我的思路

基于二分法。
判断当前索引和下一个索引的平方值与target的大小。如,若target = 10,3 * 3 < 10而4 * 4 > 10,则输出3。

注意:int类型的平方可能越界,需要采用long

public int mySqrt(int x) {
        int r = x / 2;
        int max = x;
        int result = -1;
        if(x == 0 || x == 1) {
            return x;
        }

        while(r <= x) {
            if(mul(r) > x) {//太大了,减半
                if(mul(r - 1) < x) {
                    return r - 1;
                }
                max = r;
                r = r / 2;
            } else if(mul(r) < x) {//太小了,增大
                if(mul(r + 1) > x) {
                    return r;
                }
                r = (r + max) / 2;
            } else {
                return r;
            }
        }
        return -1;
    }

    public long mul(int i) {
        return (long) i * i;
    }

心得:对于计算 i*i ,相比于直接运算,将其封装为方法会消耗更少的时间。(我当时是直接运算显示超时,封装后才通过)

答案思路

public int mySqrt(int x) {
            int l = 0;
            int r = x;

            while(l < r) {
                int mid = (l + r) / 2;
                if((long)mid * mid < x) {
                    l = mid + 1;
                } else {
                    r = mid;
                }
            }
            return (long)r*r <= x ? r : r - 1;
        }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值