X的平方根

X的平方根

题目链接

leetcode

题目描述

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

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

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

示例 1:

输入:x = 4
输出:2

示例 2:

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

提示:

0 <= x <= 231 - 1

题目解法

第一种:袖珍计算器算法,使用指数函数exp和对数函数log代替平凡根函数,指数函数和对数函数的参数和返回值都为浮点型,在运算中可能会存在误差,因此在得到结果后,要验算 结果 和结果+1哪一个才是正确答案

时间复杂度O(1) 空间复杂度O(1)

    public static int mySqrt(int x) {
        if(x == 0) {
            return 0;
        }
        int n = (int)Math.exp(0.5 * Math.log(x));
        //验算结果并返回
        return (n + 1) * (n + 1) <= x ? n + 1 : n;
    }

第二种:二分查找,由于x的平方根的整数部分 k满足 k² <= x的最大值,因此可以对k进行二分查找,从而得到答案。二分查找的下界为 0,上界可以粗略地设定为 x。在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 x 的大小关系,并通过比较的结果调整上下界的范围

    public static int mySqrt2(int x) {
        int j = 0,r = x,n = -1;
        while (j <= r) {
            int mid = j + (r - j) / 2;
            //转为long类型是防止相乘溢出(大于Int的范围)
            if((long) mid *mid <= x) {
                n = mid;
                j = mid + 1;
            }else {
                r = mid - 1;
            }
        }
        return n;
    }
posted @   China熊孩子  阅读(255)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示