[前端]_一起刷leetcode 69. x 的平方根

175 阅读2分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

题目

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. 求平方根不能用数学中的开平方的话,我们可以先顺着思路想一想如何实现。这里我第一个想到的是枚举从1开始到n的所有可能,然后每次判断一下当前数的平方值是否大于当前我们所求值,因为平方可以直接通过基础的加减乘除符号就可以求出来,所以理论上是可行的;
  2. 我们可以用for循环去判断,当然直接用while也是可行的,不过在while中需要自己去在代码块中执行自增,然后我们把最后一次出现的i记录下来即可;
  3. 由于这道题目降低了难度,直接返回整数类型,所以我们不需要考虑出现无限循环小数等特殊情况,也不需要考虑四舍五入,直接记录最后出现的最大的i值后并返回即可。

实现

for循环代码

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    let n = 0;

    for (let i = 0; i *i <= x; i++) {
        n = i;
    }
    
    return n;
};

while循环代码

使用while循环来遍历的话,我们的结果值会多出1,因为我们是向下取整的,所以我们直接把所有情况都往前取值1最后返回的时候减去即可。

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    let n = 0;

    while (n * n <= x) {
        n++;
    }

    return --n;
};

优化

在这种线性查找的题目中,我们可以使用二分查找来每次对半筛选,这样子我们只需要执行log2N次查找就可以找到我们想要的答案了。

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    let left = 0, right = x;

    while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        if (mid * mid <= x) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return --left;
};

最终结果

image.png

另外今天大年初二,祝大家新年快乐、新的一年万事如意~

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。