「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
题目
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
- 0 <= x <= 231 - 1
解题思路
方法一:Math方法直接解答(投机取巧)
通过理解题目意思,其实就是求数学中的算术平方根。
那首先想到的就是JavaScript中的Math里面有个sqrt方法欸刚好可以用,于是就有了下面的解题思路。
一行解决代码难题👇:
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
return parseInt(Math.sqrt(x));
};
方法二:二分法找右边界
- k为满足k平方 <= x,集合的最大值
- 粗略定下检索范围 0~x,k的取值可能区间为[0,x],即
left <= k <= right- 我们的循环条件为 left <= right ,终止为 left > right
- 由于left可能越界,优先返回right
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
let left=0
let right=x
while(left<=right){
let mid=left+((right-left)>>1)
if(mid*mid<=x){
left=mid+1
}else{
right=mid-1
}
}
return right
};
方法三:牛顿-拉弗森迭代法
通过下面这张图的计算公式得到解答
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
if(x === 0) {
return 0
}
return Math.floor(sqrt(x)(x))
};
// 牛顿-拉弗森迭代法
function sqrt(x) {
let origin = x;
return function inner(x) {
// xn+1 = xn - f(xn) / f'(xn)
let xn1 = x - (x*x-origin) / (2*x)
if(x - xn1 <= 0.1) { // 精度问题
return xn1
}
return inner(xn1)
}
};
结束语
这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~
让我们一起来攻克算法难关吧!!