zoukankan      html  css  js  c++  java
  • 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会指向趋近点的,其实仔细想一想也就明白了,没想明白就需要多写了好多代码!
    • 这道题刚开始没思路,想了想就有思路了,多想才是王道。
  • 相关阅读:
    学习记录6
    学习记录5
    学习记录4
    学习记录3&开启新的世界
    学习记录2
    学习记录1
    类、对象和包
    班会总结
    请简单描述一下,java程序的运行过程,以及java为什么能跨平台
    JDK、JRE、JVM的区别与关系
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4382136.html
Copyright © 2011-2022 走看看