1.题目
计算并返回x的平方根,其中x保证为非负整数。
由于返回类型是整数,因此仅返回结果的整数部分。
实例
输入:8
输出:2
2.思路
2.1思路一
这是二分查找的变式。
x的平方根范围是[0, x],在这个范围内的任何一个数字mi,都可以将[lo, hi]分为三部分:
[lo, mi) mi (mi, hi]()
(1) 如果mi * mi == x 返回mi
(2) 如果mi * mi > x 深入(mi, hi] 中继续查找
(3) 如果mi * mi < x 深入 [lo, mi) 中继续查找
2.2 思路二
牛顿法
3.实现
3.1思路一
class Solution {
public:
int mySqrt(int x) {
if(x < 2)
return x;
int lo = 0;
int hi = x;
while(lo <= hi)
{
int mi = lo + (hi - lo) / 2;
if(mi == x / mi)
return mi;
else if(mi < x / mi)
lo = mi + 1;
else
hi = mi - 1;
}
return hi;
}
};
注:
经过不断的缩减范围,最后一轮循环的时候,lo = mi = hi;
如果mi * mi < x lo = mi + 1,hi不变,此时hi是正确值。
如果mi * mi > x hi = mi - 1,hi是正确答案
返回hi。