问题描述
实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
解题思路
-
遍历<=x的数字,查找 x 的平方数,很容易想到,但是效率低下。
-
使用二分查找来寻找 x 的平方数
- 注意溢出问题,两数相乘很可能超过 int 存储范围
- 注意除零问题(若使用了除法)
代码:二分查找
/* 判断特殊情况 */
if(x == 0 || x == 1){
return x;
}
int low = 0,high = x / 2;
int middle;
while(low <= high){
/* 计算middle */
middle = 1 + (high + low - 2) / 2;
if(middle > x / middle){
high = middle - 1;
}else if(middle < x / middle){
low = middle + 1;
}else {
/* middle^2 = x 情况*/
return middle;
}
}
return high;
提交结果