1. 题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrt
2. 分析
二分法:
- 设定最大平方根值是自己,最小为0;
- 取均值m,去测试x与m的平方大小关系,若后者更大,说明max大了,将其设为中值m,等待下一次去均值将其减小;若前者更大,说明min小了,将其设置为中值m,等待下次折中后变大。
- 停止条件是:max == min。
int mySqrt(int x) {
if(x < 0) return -1;
int min = 0, max = x;
if(x == 1) return 1;
while(max - min > 1){
int m = (min + max) >> 1;
if(x / m < m) // 不能写成 x < m * m,因为会溢出
max = m;
else
min = m;
}
return min;
}