题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

输入输出

1
2
3
4
5
6
输入:x = 4
输出:2

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

基本思路

二分查找的思路 但是有两个要注意的点

  1. int mid = left + (right - left + 1) / 2;

    [left, right]区间里边只剩下两个数的时候 如果满足mid < x / mid 下一次又会死循环到left = mid 又走一遍代码 leftright值没有变化

  2. return left;

    由于边界搜索是 left = midright = mid - 1,因此退出循环的时候一定有 leftright 重合,返回 right 也可以。

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int mySqrt(int x) {
if(x == 0) return 0;
if(x == 1) return 1;
int left = 1, right = x/2;
while(left < right) {
int mid = left + (right - left + 1) / 2;
if(mid == x / mid) return mid;
else if(mid > x / mid){
right = mid - 1;
}
else{
left = mid;
}
}
return left;
}
}