【leetcode 力扣刷题】数学题之数的开根号:二分查找

news2024/11/23 18:52:57

用二分查找+牛顿迭代解决开根号

  • 69. x的平方根
  • 367. 有效的完全平方数

69. x的平方根

题目链接:69. x的平方根
题目内容:
在这里插入图片描述
题意是要我们求一个数的算数平方根,但是不能使用内置函数,那么我们就暴力枚举。我们知道如果y>=2的话,y*y >= 2*y,所以我们不需要遍历1~x,只需要遍历1~x/2。需要注意x很大时,判断y*y和x的大小关系,y*y可能会溢出,因此应该换成比较y和x/y的大小关系。完整代码如下(C++):

class Solution {
public:
    int mySqrt(int x) {
    	//特殊情况——0、1,实际上不单独写也行
        if(x == 1) return 1;
        long curr = 1;
        //不能用curr*curr,可能会溢出
        while(curr <= x/curr)
            curr++;
        //循环结束时curr*curr > x,所以需要-1
        return curr-1;
    }
};

上面是直接暴力枚举,可以用二分查找来优化,查找范围还是1~x/2。代码如下(C++):

class Solution {
public:
    int mySqrt(int x) {
        if(x == 0) return 0;
        int left = 1, right = x>>1;
        int ans = 1;
        //二分法
        while(left <= right){
            int mid = left + (right - left)/2;
            if(mid <= x/mid){
                ans = mid; //更新ans
                left = mid + 1;
            }
            else{
                right = mid - 1;
            }
        }
        return ans;
    }
};

接下来是一种数学方法——牛顿迭代。假设有函数f(x) = x^2 - C,其中C等于题目给出的x,函数f(x)的零点就是±根号C,其中正的那个向下取整就是答案。牛顿更新法首先将x0初始化为C,在(x0, f(x0))处的切线斜率为2*x0,切线与x轴的交点为x1 = (x0^2 +C/(2*x));之后将x0更新为x1,x0就逐渐向答案逼近。何时终止呢?如果循环用**while(x0 > x/x0)**的话,有些测试用例,比如x=7,会超出时间限制。因为后面x0和x1差异很小,更新非常缓慢,此时也已经接近零点了【因为在零点处,与x轴的交点就是自己】。因此要使用fabs(x1 - x0) < 1e-7这样的条件跳出循环【其中1e-7表示极小的非负数,判断x1和x0是否差异极小,非常接近】。完整代码如下:

class Solution {
public:
    int mySqrt(int x) {
        if(x == 0) return 0;
        double C = x, x0 = x;
        while(x0 > x/x0){
            double x1 = 0.5 *(x0 + C/x0);
            if(fabs(x0 - x1) < 1e-7)
                break;
            x0 = x1;
        }
        return int(x0);
    }
};

367. 有效的完全平方数

题目链接:367. 有效的完全平方数
题目内容:
在这里插入图片描述
这道题目和上面一道题目其实是一样的。用上面题的方法求得其向下取整的平方根ans,如果ans*ans == num,就说明其是完全平方数,如果ans*ans < num,说明其不是完全平方数。
代码如下:(C++)

  • 暴力
class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num == 1) return true;
        long curr = 1;
        while(curr < num/curr)
            curr++;
     	//判断
        if(curr*curr == long(num)) return true;
        return false;

    }
};
  • 二分
class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num == 0) return true;
        int left = 1, right = num/2;
        long ans = 1;
        while(left <= right){
            int mid = left + (right - left)/2;
            if(mid <= num/mid){
                ans = mid;
                left = mid + 1;
            }
            else 
                right = mid - 1;
        }
        return ans*ans == long(num) ? true : false;
    }
};
  • 牛顿迭代
class Solution {
public:
    bool isPerfectSquare(int num) {
        double x0 = num;
        while( x0 > x0/num){
            double x1 = 0.5 *(x0 + num/x0);
            //跳出循环
            if(fabs(x0-x1)<1e-7)
                break;
            x0 = x1;
        }
        return int(x0)*int(x0) == num ? true : false;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-9-2 Kruskal算法求最小生成树

题目链接&#xff1a;Kruskal算法求最小生成树 #include <iostream> #include <algorithm>using namespace std;const int N 200010;// 与并查集中的p含义相同 int p[N];struct Edge {int a, b, w;bool operator< (const Edge & W)const{return w < W.w…

广场舞音乐制作软件,FL Studio怎么做广场舞音乐

广场舞一直以来都是许多人日常的消遣方式之一&#xff0c;富有节奏感的音乐能够让人沉浸其中&#xff0c;这也说明了音乐的重要性。那么如果我们想自己制作一个广场舞风格的音乐&#xff0c;需要具备哪些条件呢&#xff1f;今天我们就来说一说广场舞音乐制作软件&#xff0c;FL…

分页功能实现

大家好 , 我是苏麟 , 今天聊一聊分页功能 . Page分页构造器是mybatisplus包中的一个分页类 . Page分页 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</ver…

指针结构体题

目录 初阶指针_指针的概念 1.使用指针打印数组内容 2.字符串逆序 3.整形数组和字符串数组 4.打印菱形 5.打印水仙花数 6.计算求和 结构体 7.喝汽水问题 8.程序死循环解释 9.选择题总结tips 今天是重点是指针&结构体题题目。&#x1f197;&#x1f197;&#x…

(超简单)将图片转换为ASCII字符图像

将一张图片转换为ASCII字符图像 原图&#xff1a; 效果图&#xff1a; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileWriter; import java.io.IOException;public class ImageToASCII {/*** 将图片转换为A…

dlopen “libnvcuvid.so“ failed!

在使用NVIDIA DALI库进行视频数据处理时&#xff0c;出现了以上打开libnvcuvid.so动态库错误的问题&#xff0c;如下图所示&#xff1a; libnvcuvid.so是使用CUDA进行硬编解码需要的一个库&#xff0c;使用NVIDIA DALI进行视频处理时会依赖它。 本人是在Docker容器中运行的程序…

Flink实时计算中台Kubernates功能改造点

背景 平台为数据开发人员提供基本的实时作业的管理功能,其中包括jar、sql等作业的在线开发;因此中台需要提供一个统一的SDK支持平台能够实现flink jar作业的发布;绝大多数情况下企业可能会考虑Flink On Yarn的这个发布模式,但是伴随云原生的呼声越来越大,一些企业不希望部…

肖sir__linux详解__002(系统命令)

linux系统命令 1、df 查看磁盘使用情况 &#xff08;1&#xff09;df 查看磁盘使用情况&#xff08;按kb单位显示&#xff09; &#xff08;2&#xff09;df -h 按单位显示磁盘使用情况 2、top 实时查看动态进程 &#xff08;1&#xff09;top 详解&#xff1a; 第一行&…

股票贷款行业,给你一个低成本有效的获客渠道

我们比市场上的同行公司具有更多的质量优势。我们的推广部门不断使用大数据引导和定位技术以及促销策略的迭代升级&#xff0c;具有足够强大的硬实力&#xff0c;可以引导客户提供更优质的投资者。为金融公司带来更好的资源。现在的股票加粉主要是&#xff1a;微信加粉/Q组/留电…

C语言:三子棋小游戏

简介&#xff1a; 目标很简单&#xff1a;实现一个 三子棋小游戏。三子棋大家都玩过&#xff0c;规则就不提及了。本博文中实现的三子棋在对局中&#xff0c;电脑落子是随机的&#xff0c;不具有智能性&#xff0c;玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一…

2023年王炸面试题每日一练--为什么会有精度的损失

基本数据类型中为什么会出现精度损失&#xff0c;怎么样会避免出现精度损失 loat 32位 出现精度损失的原因&#xff1a; 输入的值为十进制&#xff0c;而在计算的过程中&#xff0c;是要把十进制的小数位值在有限位的情况下转变为二进制的小数&#xff0c;就会出现精度的损失…

十一、MySQL(DQL)聚合函数

1、聚合函数 注意&#xff1a;在使用聚合函数时&#xff0c;所有的NULL是不参与运算的。 2、实际操作&#xff1a; &#xff08;1&#xff09;初始化表格 &#xff08;2&#xff09;统计该列数据的个数 基础语法&#xff1a; select count(字段名) from 表名; &#xff1b;统…

绿色光伏代步工具

太阳能是可再生能源&#xff0c;光线的来源是太阳&#xff0c;几乎不会枯竭。相比化石燃料等非可再生能源&#xff0c;太阳能的利用不会对资源造成耗竭和短缺问题&#xff0c;在现今社会中的文化&#xff0c;旅游层面&#xff0c;也已经得到充分的发展和拓展出多方面的应用模式…

JAVA 求最小公因数

JAVA 求最小公因数 文章目录 JAVA 求最小公因数方法一&#xff1a;枚举法的第一种方法一&#xff1a;枚举法的第二种方法二&#xff1a;展转相除法(欧几里德算法)方法三&#xff1a;递归拓展 求最小公倍数公式为 题目&#xff1a;任意输入两个整数&#xff0c;如何求他们的最大…

使用VisualStudio制作上位机(六)

文章目录 使用VisualStudio制作上位机&#xff08;六&#xff09;第五部分&#xff1a;应用程序打包第一步&#xff1a;勾选为Release模式第二步&#xff1a;生成解决方案第三步&#xff1a;将我们额外添加的文件放入到Release这个文件夹里 使用VisualStudio制作上位机&#xf…

400. 第 N 位数字

链接&#xff1a; ​​​​​​400. 第 N 位数字 题解&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:int findNthDigit(int n) {int len1;//初始数字长度为1int base1;//初始范围为1~9while(n>(long)len…

ROS机器人编程ROS机器人编程---------(三)创建工作空间和功能包

创建工作空间和功能包 创建工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace编译工作空间 cd ~/catkin_ws/ catkin_make设置环境变量 source devel/setup.bash检查环境变量 echo $ROS_PACKAGE_PATH创建功能包 cd ~/catkin_ws/src catkin_crea…

【word密码】如何限制word文件中部分内容?

Word文件中有一部分内容不想他人编辑&#xff0c;我们可以设置限制编辑&#xff0c;可以对一部分内容设置限制编辑&#xff0c;具体方法如下&#xff1a; 我们将需要将可以编辑的地方选中&#xff0c;然后打开限制编辑功能 然后勾选限制编辑设置界面中的【限制编辑】和【每个人…

RT-Thread 中断管理学习(一)

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。生活中&#xff0c;我们经常会遇到这样…

LDAP服务器如何重启

1、find / -name ldap 该命令只会从根路径下查看ldap文件夹 find / -name ldap2、该命令会从根路径/查看所有包含ldap路径的文件夹&#xff0c;会查询出所有&#xff0c;相当于全局查询 find / -name *ldap*2、启动OpenLADP 找到LDAP安装目录后&#xff0c;执行以下命令 #直…