[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

  

posted @ 2013-08-11 16:29  阿牧遥  阅读(200)  评论(0编辑  收藏  举报