69. Sqrt(x)
Implement int sqrt(int x).
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842…, and since
the decimal part is truncated, 2 is returned.
这个题看起来很简单,但是不注意细节的话,可能要做很久才做得出来。
比如:
- 溢出问题,如果用i*i>x来判断的好这肯定会溢出。如果用double,涉及到转型等很烦的问题
- 超时问题。怎样能快速解决?用for循环从0开始一个一个的平方比较?
这个题,我想到了二分法,能很快解决问题,但是我用了double转型来解决溢出问题,导致问天变得比较繁琐然后就放弃了。所以就去看了下大神的代码
public int mySqrt(int x) {
if (x == 0)
return 0;
int left = 1, right = Integer.MAX_VALUE;
while (true) {
int mid = left + (right - left)/2;
if (mid > x/mid) {
right = mid - 1;
} else {
if (mid + 1 > x/(mid + 1))
return mid;
left = mid + 1;
}
}
}
大神也是用的二分法,但是他用了一个很巧妙的方法(连小学生都学过)移项
来避免了溢出的问题,嗯?最开始我还没看懂这个操作, ̄□ ̄||,
二分法就是,我先取二分之一,然后平方比较,如果比x大,就取四分之一比较,如果比x小,那就四分之一加上八分之一,。。。类似这样,画个图就懂了。