首先,此题很显然是二分查找,但边界条件并不简单。方法我用了0,1,2,3,4,5五个测试用例确定下来的。但是后来居然超时了,难道死循环?后来看了下,果然是int溢出,还是要用long。典型的坑啊。
但看了参考中的方法:http://discuss.leetcode.com/questions/245/sqrtx 后发现,可以用
mid=left+(right-left)/2;
if(mid==x/mid)
这样的方法来避开溢出,精妙。
public class Solution {
public int sqrt(int x) {
// Start typing your Java solution below
// DO NOT write main() function
long left = 0;
long right = x;
while (left <= right) {
long mid = (left + right) / 2;
long c = mid * mid;
if (c == x) {
return (int)mid;
}
else if ( c > x) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return (int)right;
}
}
Python3,这里最后用mid测了一下,否则就是mid-1
class Solution:
def mySqrt(self, x: int) -> int:
low = 0
high = x
while low <= high:
mid = (high - low) // 2 + low
if mid ** 2 == x:
return mid
elif mid ** 2 > x:
high = mid - 1
else:
low = mid + 1
if mid ** 2 > x:
return mid - 1
else:
return mid