码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构-其他


    数据结构-其他

    • 1、剑指 Offer II 072. 求平方根【科大讯飞】
      • 方法一:二分查找【重要】
      • 方法二:袖珍计算器算法
      • 方法三:牛顿迭代

    1、剑指 Offer II 072. 求平方根【科大讯飞】

    题目:https://leetcode.cn/problems/jJ0w9p/
    给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。正数的平方根有两个,只输出其中的正数平方根。如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。
    0 <= x <= 231 - 1

    示例 1:
    输入: x = 4
    输出: 2
    
    • 1
    • 2
    • 3
    输入: x = 8
    输出: 2
    解释: 8 的平方根是 2.82842...,由于小数部分将被舍去,所以返回 2
    
    • 1
    • 2
    • 3

    方法一:二分查找【重要】

    • 时间复杂度:O(logx)
    • 空间复杂度:O(1)
    class Solution {
    public:
        int mySqrt(int x) {
            int left = 0, right = x;
            int res = -1;
            while(left <= right){
                int mid = left + ((right - left)>>1);
                if((long long)mid * mid <= x){
                    res = mid;
                    left = mid + 1;
                }else right = mid - 1;
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    方法二:袖珍计算器算法

    「袖珍计算器算法」是一种用指数函数 exp 和对数函数 ln 代替平方根函数的方法。通过有限的可以使用的数学函数,得到想要计算的结果。
    在这里插入图片描述
    【注:由于计算机无法存储浮点数的精确值,而指数函数和对数函数的参数和返回值均为浮点数,因此运算过程中会存在误差。例如当 x = 2147395600x=2147395600 时,在这里插入图片描述
    因此在得到结果的整数部分 ans 后,应当找出 ans 与ans+1 中哪一个是真正的答案。】

    • 时间复杂度:O(1),由于内置的 exp 函数与 log 函数一般都很快,在这里将其复杂度视为 O(1)。
    • 空间复杂度:O(1)。
    class Solution {
    public:
        int mySqrt(int x) {
            if (x == 0) {
                return 0;
            }
            int ans = exp(0.5 * log(x));
            return ((long long)(ans + 1) * (ans + 1) <= x ? ans + 1 : ans);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方法三:牛顿迭代

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 时间复杂度:O(logx),此方法是二次收敛的,相较于二分查找更快。
    • 空间复杂度: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(fabs(x0 - xi) < 1e-7) return int(xi);
                x0 = xi;
            }
            return int(x0);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    09-18-k8s-二进制方式搭建
    [附源码]Java计算机毕业设计SSM高校本科毕业及资料存档管理系统
    【ceph】ceph集群删除pool报错: “EPERM: pool deletion is disabled“
    Linux云服务环境安装-Mysql8.0篇
    【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)
    vue之下拉菜单
    正点原子嵌入式linux驱动开发——Buildroot根文件系统构建
    把自己本地项目发布到Gitee
    Vue.js+SpringBoot开发音乐偏好度推荐系统
    16S全长测序揭示绿头虻肠道微生物及共生细菌
  • 原文地址:https://blog.csdn.net/Never_say_die_kj/article/details/126048999
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号