题目
实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
函数原型
C
的函数原型:
int mySqrt(int x){}
边界判断
int mySqrt(int x){
if( x < 0 ) // 根号下不为负数
return -1;
if( x == 0 )
return 0;
}
算法设计:二分
思路:平方根一定在 [1, x] 之间,那这个数有啥特点呢?
如, 4 4 4 的平方根是 2 2 2, 9 9 9 的平方根是 3 3 3。
4 / 2 = 2 9 / 3 = 3 4~ / ~2 = 2~~~~~~~~~~~~~~~~9 ~ / ~ 3 = 3 4 / 2=2 9 / 3=3
得到一个判定条件:x / mid == mid
时,就是这个数。
int mySqrt(int x){
if( x < 0 ) // 根号下不为负数
return -1;
if( x == 0 )
return 0;
if( x == 1 )
return 1;
int left = 0;
int right = x;
int mid;
while( left < right ){
mid = (left + right) / 2;
if( x / mid == mid ) // 找到解
return mid;
else if( x / mid < mid )
right = mid - 1;
else if( x / mid > mid )
left = mid + 1;
}
return (x / left < left ? left - 1 : left);
// 最后判断找到的整数的平方是否大于x 也要用除法,防止越界
}
代码的一点技巧:防溢出。
mid = ( left + (right - left + 1) )>> 1