[力扣日记]69. x 的平方根

141 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

题目

69. x 的平方根

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

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

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

示例 1:

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

提示:

  • 0 <= x <= 231 - 1

思路

  1. 利用二分查找的思想,因为x的平方根肯定是比x小的,也就是说在0 - x中寻找一个数。在某个连续序列中寻找一个数一般用的就是二分查找。
  2. 设置中间数时,要注意题目中说的一点 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。,所以我们取的中间数只能取整,而且这里只能向下取整。
  3. 在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 x 的大小关系,并通过比较的结果调整上下界的范围。

实现

js版本:

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    if(x === 0 || x === 1) return x
    let left = 1
    let right = x
    let res = -1
    while(left <= right){
        let mid = Math.floor((left + right) / 2)
        if(mid * mid <= x){
            res = mid
            left = mid + 1
        }else{
            right = mid - 1
        }
    }
    return res;
};

python版本:

class Solution:
    def mySqrt(self, x: int) -> int:
        left, right, res = 0, x, -1
        while left <= right:
            mid = (left + right) // 2
            if mid * mid <= x:
                res = mid
                left = mid + 1
            else:
                right = mid - 1
        return res

php版本:

class Solution
{

    /**
     * @param Integer $x
     * @return Integer
     */
    function mySqrt($x)
    {
        if($x === 1 || $x === 0) return $x;
        $left = 1;
        $right = $x;
        $res = -1;
        while ($left <= $right) {
            $mid = floor(($left + $right) / 2);
            if($mid * $mid <= $x){
                $res = $mid;
                $left = $mid + 1;
            }else{
                $right = $mid - 1;
            }
        }
        return $res;
    }
}