zoukankan      html  css  js  c++  java
  • 二分查找——x 的平方根

    实现 int sqrt(int x) 函数。

    计算并返回 x 的平方根,其中 x 是非负整数。

    由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

    示例 1:

    输入: 4
    输出: 2
    示例 2:

    输入: 8
    输出: 2
    说明: 8 的平方根是 2.82842...,
      由于返回类型是整数,小数部分将被舍去。

    方法一:二分查找

    class Solution {
        public int mySqrt(int x) {
            int l = 0, r = x, ans = -1;
            while (l <= r) {
                int mid = l + (r - l) / 2;
                if ((long) mid * mid <= x) {
                    ans = mid;
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            return ans;
        }
    }

    复杂度分析

    • 时间复杂度:O(log x)O(logx),即为二分查找需要的次数。

    • 空间复杂度:O(1)O(1)。

    方法二:牛顿迭代法

     

     

     

    复杂度分析

    • 时间复杂度:O(log x)O(logx),此方法是二次收敛的,相较于二分查找更快。

    • 空间复杂度:O(1)O(1)。

    class Solution {
        public int mySqrt(int x) {
            if (x == 0) {
                return 0;
            }
    
            double C = x, x0 = x;
            while (true) {
                double xi = 0.5 * (x0 + C / x0);
                if (Math.abs(x0 - xi) < 1e-7) {
                    break;
                }
                x0 = xi;
            }
            return (int) x0;
        }
    }

    总结:牛顿迭代法更加常用,效率更高。

  • 相关阅读:
    二层设备与三层设备的区别--总结
    转载-vim配置收藏
    Docker入门
    Docker入门
    Docker入门
    Docker入门
    Docker入门
    树莓派进阶之路 (037)
    基于Centos搭建个人 Leanote 云笔记本
    基于CentOS搭建私有云服务
  • 原文地址:https://www.cnblogs.com/xiaoming521/p/15024793.html
Copyright © 2011-2022 走看看