Sqrt(x)

Sqrt(x)

问题:

Implement int sqrt(int x).

Compute and return the square root of x.

思路:

  二分查找

我的代码:

public class Solution {
    public int sqrt(int x) {
        if(x <=0 ) return 0;
        int left = 1;
        int right = (int)Math.ceil(((long)x+1)/2);
        int rst = -1;
        long diff = Long.MAX_VALUE;
        while(left <= right)
        {
            int mid = (left + right)/2;
            long tmp = (long)mid*mid;
            if(tmp == x)
            {
                return mid;
            }
            if(tmp > x) right = mid - 1;
            else
            {
               left = mid + 1; 
               if(Math.abs(tmp - x) < diff){
                    rst = mid;
                    diff = Math.abs(tmp - x);
                }
            }
        }
        return rst;
    }
}
View Code

他人代码:

public class Solution {
    public int sqrt(int x) {
        if (x == 1 || x == 0) {
            return x;
        }
        
        int left = 1;
        int right = x;
        
        while (left < right - 1) {
            int mid = left + (right - left) / 2;
            int quo = x / mid;
            
            if (quo == mid) {
                return quo;
            // mid is too big    
            } else if (quo < mid) {
                right = mid;
            } else {
                left = mid;
            }
        }
        
        return left;
    }
}
View Code

学习之处:

  • 对于int类型的是,为了考虑到所有的corner case 对于+1 *2 等操作一定要转换成Long 类型再做,要不溢出啦!溢出啦!
  • 抓住一个特点:(int)√x*(int)√x ≤ x 不可能出现在大的那一边的
  • 没有必要跟踪和更新最小值的操作的right节点right会指向趋近点的,其实仔细想一想也就明白了,没想明白就需要多写了好多代码!
  • 这道题刚开始没思路,想了想就有思路了,多想才是王道。
原文地址:https://www.cnblogs.com/sunshisonghit/p/4382136.html