【LeetCode】每日一题 69. x 的平方根

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

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

解题思路

// 二分法
根据题目让我们求x的算术平方根,而且x是一个非负整数,结果也是只保留整数部分,小数部分将全部被舍去
​
同时题目要求我们不可以使用pow(x,0.5)或者 x ** 0.5 这种函数
​
因此我们可以想到用二分法来解决这个题目
​
初始最小的变量为0,最大的变量为题目给定的x
​
通过最小变量和最大变量求一个中间值
​
如果中间值的平方大于x,则把中间变量赋值给最大变量,否则就是把中间变量赋值给最小变量
​
以此类推,当最大变量减去最小变量值为1的时候,我们即可返回最小变量,即最小变量就是我们需要求的值!

代码实现

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    let begin = 0; // 最小变量
    let end = x; // 最大变量
    if (x === 1 || x === 0) return x; // 特殊情况特殊处理
    while (end - begin !== 1) { // 最大变量 - 最小变量 不等于1 的时候继续循环函数
        let mid = Math.floor((begin + end) / 2); // 求的中间值,如果为小数向下取整保留整数部分
        if (mid * mid === x) return mid; // 如果中间变量的平方等于最大变量,则说明中间变量就是题目给定数的算术平方根
        if (mid * mid < x) { // 如果中间变量的平方 小于 题目给定的值,就把中间变量赋值给最小变量,否则就是把中间变量赋值给最大变量
            begin = mid;
        } else {
            end = mid;
        }
    }
    return begin; // 最后,最小变量即是我们所求的值
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;