[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
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号