题目描述:
实现
int sqrt(int x)
函数。
计算并返回x
的平方根,其中x
是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入:4
输出:2
示例 2:
输入:8
输出:2
说明:8
的平方根是2.82842
…,
由于返回类型是整数,小数部分将被舍去。
思路:
正常就是设一个变量i
从0
开始遍历,判断i * i
与x
的大小关系,一直到i * i
大于x
,就返回i-1
。
但是这样明显太慢了。
我们简单分析一下这个寻找答案的过程,不难发现其思路就是取i
从0
遍历到x
,找出一个满足条件i * i < x
的最大的i
,这恰恰符合二分答案
的基本套路啊。
代码:
class Solution {
public int mySqrt(int x) {
if (x == 0) {
return 0;
}
int left = 1, right = x;
int mid;
while (right > left + 1) {
mid = left + (right - left) / 2;
int temp = x / mid;
// 这里如果直接比较 mid * mid 跟 x 大小是有问题的,因为mid * mid可能整数溢出
if (temp == mid) {
return mid;
} else if (temp < mid) {
right = mid;
} else {
left = mid;
}
}
return left;
}
}