[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;

    }

}

  

你可能感兴趣的:(LeetCode)