一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
题目
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小的,也就是说在0 - x中寻找一个数。在某个连续序列中寻找一个数一般用的就是二分查找。
- 设置中间数时,要注意题目中说的一点
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。,所以我们取的中间数只能取整,而且这里只能向下取整。 - 在二分查找的每一步中,我们只需要比较中间元素
mid的平方与x的大小关系,并通过比较的结果调整上下界的范围。
实现
js版本:
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
if(x === 0 || x === 1) return x
let left = 1
let right = x
let res = -1
while(left <= right){
let mid = Math.floor((left + right) / 2)
if(mid * mid <= x){
res = mid
left = mid + 1
}else{
right = mid - 1
}
}
return res;
};
python版本:
class Solution:
def mySqrt(self, x: int) -> int:
left, right, res = 0, x, -1
while left <= right:
mid = (left + right) // 2
if mid * mid <= x:
res = mid
left = mid + 1
else:
right = mid - 1
return res
php版本:
class Solution
{
/**
* @param Integer $x
* @return Integer
*/
function mySqrt($x)
{
if($x === 1 || $x === 0) return $x;
$left = 1;
$right = $x;
$res = -1;
while ($left <= $right) {
$mid = floor(($left + $right) / 2);
if($mid * $mid <= $x){
$res = $mid;
$left = $mid + 1;
}else{
$right = $mid - 1;
}
}
return $res;
}
}