[leetcode]Sqrt(x)
首先,此题很显然是二分查找,但边界条件并不简单。方法我用了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