LeetCodeJava题解 69. Sqrt(x)

题目地址:69. Sqrt(x)
解题思路:这道题虽然说是简单题,但是还是卡了我不少时间的。

首先是mid的条件,一开始我写的是mid=(low+high)/2,但是看大佬们的题解,都写成了mid = low + (high - low) / 2,说是这样效率更高,我实测也比我之前的写法少了0.3MB内存消耗。

其次是我似乎陷入了一种思维定式,之前写了mid*mid==x这个多余的if条件,这也是可以改进的地方。

最后就是对特殊值0,1的处理,避免多余的运算,以及计算平方的时候转换为long类型,防止超出Int的上限。

最为灵性的是要知道一个数的平方根不会大于这个数的一半,这样可以极大减少计算量(缩短约一半)

class Solution {
    public int mySqrt(int x) {

        if (x == 0) {
            return 0;
        }

        if (x == 1) {
            return 1;
        }

        int low = 0;
        //一个数的平方根不会超过一个数的一半(0和1除外)
        int high = x/2;
        int ans = -1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if ((long) mid * mid > x) {
                high = mid - 1;
            } else {
                ans = mid;
                low = mid + 1;
            }
        }
        return ans;
    }
}
原文地址:https://www.cnblogs.com/hooyeefam/p/15773245.html