这是我参与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开始到n的所有可能,然后每次判断一下当前数的平方值是否大于当前我们所求值,因为平方可以直接通过基础的加减乘除符号就可以求出来,所以理论上是可行的; - 我们可以用
for循环去判断,当然直接用while也是可行的,不过在while中需要自己去在代码块中执行自增,然后我们把最后一次出现的i记录下来即可; - 由于这道题目降低了难度,直接返回整数类型,所以我们不需要考虑出现无限循环小数等特殊情况,也不需要考虑四舍五入,直接记录最后出现的最大的
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;
};
最终结果
另外今天大年初二,祝大家新年快乐、新的一年万事如意~
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。