69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
题目
示例 1
输入:x = 4
输出:2
示例 2
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
答案
对撞指针
思路:
- 缩小范围 right = x/2 +1 (由于 x 的一半的平方总大于 x,可以直接干掉 x 一半,缩小范围)
- 对撞指针找到最大中间值(mid * mid <= x)
var mySqrt = function(x) {
// 二分法
let left = 0 // 0 到 中间
let right = x/2+1 // 由于x的一半的平方总大于x,可以直接干掉x一半,缩小范围
//常规二分法:不断取中间值去尝试。直到left <= right 的值为止,说明left已经到达中间
while (left <= right) {
// 取中间
let mid=left+Math.floor((right-left)/2);
// 找到mid * mid 小于x 的最大mid
if(mid * mid <= x){
left = mid +1 // 正向遍历
}else{
right = mid - 1; // 反向遍历
}
}
return left-1
};
console.log(mySqrt(4))