zoukankan      html  css  js  c++  java
  • 69. Sqrt(x)

    原题链接:https://leetcode.com/problems/sqrtx/description/
    这道题目是让实现求一个平方根的约数,我的实现如下:

    /**
     * Created by clearbug on 2018/2/26.
     */
    public class Solution {
    
        public static void main(String[] args) {
            Solution s = new Solution();
            System.out.println(s.mySqrt(0));
            System.out.println(s.mySqrt(1));
            System.out.println(s.mySqrt(2));
            System.out.println(s.mySqrt(3));
            System.out.println(s.mySqrt(4));
            System.out.println(s.mySqrt(8));
            System.out.println(s.mySqrt(9));
            System.out.println(s.mySqrt(10));
            System.out.println(s.mySqrt(2147483647));
        }
    
        public int mySqrt(int x) {
            for (int i = 0; i < x; i++) {
                int curr = i * i;
                int largest = (i + 1) * (i + 1);
    
                if (largest < curr) { // 防止整形溢出
                    return i;
                }
    
                if (curr == x) {
                    return i;
                }
                if (largest == x) {
                    return i + 1;
                }
                if (curr < x && largest > x) {
                    return i;
                }
            }
    
            return 0;
        }
    
    }
    

    自认为代码还算简洁,思路还算清晰,但是 Submission Detail 却是:beats 3.73%!!!这让我很尴尬,那么怎么提高效率呢?随便看了下别人提交的答案,使用了类似二分查找的思想来提高效率,好吧,我们也来试试喽:

    /**
     * Created by clearbug on 2018/2/26.
     */
    public class Solution {
    
        public static void main(String[] args) {
            Solution s = new Solution();
            System.out.println(s.mySqrt(0));
            System.out.println(s.mySqrt(1));
            System.out.println(s.mySqrt(2));
            System.out.println(s.mySqrt(3));
            System.out.println(s.mySqrt(4));
            System.out.println(s.mySqrt(8));
            System.out.println(s.mySqrt(9));
            System.out.println(s.mySqrt(10));
            System.out.println(s.mySqrt(2147483647));
        }
    
        public int mySqrt(int x) {
            if (x == 0) {
                return 0;
            }
            if (x == 1) {
                return 1;
            }
    
            int start = 0;
            int end = x;
            while (start + 1 < end) {
                int middle = (start + end) / 2;
    
                if (middle < x / middle) {
                    start = middle;
                } else if (middle > x / middle) {
                    end = middle;
                } else {
                    return middle;
                }
            }
    
            return start;
        }
    
    }
    

    可以看到,首先避免了整形移除的问题,然后使用二分查找思想加快了逼近结果的速度!

  • 相关阅读:
    如何在Windows 7平台搭建Android Cocos2d-x3.2alpha0开发环境
    boost::unordered_map分析和使用(转)
    #、##、__VA_ARGS__和##__VA_ARGS__的作用(转)
    C++ explicit关键字详解(转)
    C++11的auto关键字
    Nagios监控系统
    CentOS6.5安装oracle11
    Centos7系统中Mysql登录忘记root密码
    在Centos7系统上查看Mysql版本的方法
    忘记Redhat7root密码
  • 原文地址:https://www.cnblogs.com/optor/p/8576661.html
Copyright © 2011-2022 走看看