LeetCode 69—— x 的平方根

news2024/10/5 13:40:14

阅读目录

    • 1. 题目
    • 2. 解题思路一
    • 3. 代码实现一
    • 4. 解题思路二
    • 5. 代码实现二

1. 题目

2. 解题思路一

二分查找法,对于整数 i ∈ [ 0 , x ] i \in [0,x] i[0,x],我们判断 i 2 i^2 i2 x x x 的关系,然后找到最后一个平方小于等于 x x x 的整数即可。

需要注意,为了避免求平方的时候整数溢出,需要选用 long long 类型。

另外, ( x 2 ) 2 = 1 4 x 2 > x (\frac{x}{2})^2=\frac{1}{4}x^2 > x (2x)2=41x2>x,当 x > 4 x > 4 x>4 的时候均成立,但由于我们这里求的是整数,所以则是当 x > 5 x > 5 x>5 的时候我们可以将搜索区间缩短为 i ∈ [ 0 , x / 2 ] i \in [0,x/2] i[0,x/2]

3. 代码实现一

class Solution {
public:
    int mySqrt(int x) {
        int left = 0;
        int right = x;
        if (x > 5) {
            right = x / 2;
        }
        while (left <= right) {
            int mid = left + (right - left) / 2;
            long long target = (long long)mid * mid;
            if (target < x) {
                left = mid + 1;
            } else if (target > x) {
                if ( (long long)(mid-1) * (mid-1) <= x) {
                    return mid-1;
                } else {
                    right = mid - 1;
                }
            } else {
                return mid;
            }
        }
        return right;
    }
};

4. 解题思路二

实际上,我们所求的即是方程 f ( a ) = a 2 − x = 0 f(a)=a^2-x=0 f(a)=a2x=0 的值,我们可以用牛顿迭代法来求解。

假设初始值为 a 0 , f ( a 0 ) = a 0 2 − x a_0, f(a_0)=a_0^2-x a0,f(a0)=a02x,切线斜率为 2 a 0 2a_0 2a0,那么切线的方程为:

y = 2 a 0 ( z − a 0 ) + ( a 0 2 − x ) y=2a_0(z-a_0)+(a_0^2-x) y=2a0(za0)+(a02x)

切线与 x x x 轴的交点为, z = 1 2 a 0 + x 2 a 0 z=\frac{1}{2}a_0+\frac{x}{2a_0} z=21a0+2a0x

这样,我们继续在 a 1 = z a_1=z a1=z 处作新的切线,如果两次切线与 x x x 轴的交点足够接近,那么我们就得到方程的解了。

5. 代码实现二

class Solution {
public:

    int mySqrt(int x) {
        if (x == 0) {
            return 0;
        }
        double a0 = x;
        while (1) {
            double a1 = 0.5 * a0 + x / 2.0 / a0;
            if (fabs(a0 - a1) < 1e-7) {
                break;
            }
            a0 = a1;
        }
        return int(a0);
    }
};

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

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

相关文章

DRF权限组件源码分析

DRF权限组件源码分析 权限组件相关配置同认证组件 0 认证组件的两种返回值 有权限&#xff0c;返回True&#xff0c;程序正常进行无权限&#xff0c;返回False&#xff0c;程序抛出异常 1 单视图应用 2 多视图应用 3 单视图多视图结合 在drf中&#xff0c;默认优先去全局中…

java大学生兼职就业求职招聘管理系统hg241-vue+Springboot

大学生兼职中心系统是一个帮助学生正确安排课余时间的系统&#xff0c;同学们可以根据课程的多少来选择不同的兼职工作&#xff0c;而商家也可以从不同的学生中挑选适合的人选。既然是兼职&#xff0c;那么这些工作基本都是按照小时来计算工资的&#xff0c;也许不会很高&#…

【Linux】项目自动化构建工具make/makefile的简单使用

使用步骤 1) 编写 创建 makefile 文件 vim makefile用 vim 打开名为 makefile 的文件,存在该文件则打开编辑,不存在则创建并打开.在 makefile 文件中编写需要编译的文件 test:test.cppg -o test test.cpp第一行: 冒号左侧为编译后的可执行文件名,可以随便取. 冒号右侧为依赖…

【C++庖丁解牛】C++11---lambda表达式 | 包装器

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. lambda表达式1.1 C98中…

「C++ 内存管理篇 00」指针

目录 一、变量&#xff0c;变量名和指针 1. 什么是变量&#xff1f; 2. 变量名和指针 3. 使用指针获取数据 二、指针变量和数组变量 三、编译器对指针的等级有着严格的检查 四、指针的加减 1. 存放指针的变量的加减 2. 存放指针的变量的自增自减 3. 两个指针相减 一、变量&…

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路&#xff1a;通过使用axios拦截器&#xff0c;在请求拦截器中开启全屏Loading&#xff0c;然后在响应拦截器中将Loading关闭。 代码&#xff1a; 问题&…

CD-PAN复合纳米纤维膜

CD-PAN复合纳米纤维膜可能是通过某种特定的方法&#xff0c;如溶剂热反应或水热反应等&#xff0c;将CdS纳米颗粒与PAN&#xff08;聚丙烯腈&#xff09;纳米纤维结合起来的复合材料。 这种复合纳米纤维膜可能会继承CdS的光电性质和PAN纳米纤维的机械性能&#xff0c;从而在某些…

Golang | Leetcode Golang题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; func rotateRight(head *ListNode, k int) *ListNode {if k 0 || head nil || head.Next nil {return head}n : 1iter : headfor iter.Next ! nil {iter iter.Nextn}add : n - k%nif add n {return head}iter.Next headfor add > …

R语言4版本安装mvstats(纯新手)

首先下载mvstats.R文件 下载mvstats.R文件点此链接&#xff1a;https://download.csdn.net/download/m0_62110645/89251535 第一种方法 找到mvstats.R的文件安装位置&#xff08;R语言的工作路径&#xff09; getwd() 将mvstats.R保存到工作路径 在R中输入命令 source(&qu…

Day27:阻塞队列、Kafka入门、发送系统通知、显示系统

阻塞队列BlockingQueue BlockingQueue 解决线程通信的问题。阻塞方法:put、take。 生产者消费者模式 生产者:产生数据的线程。消费者:使用数据的线程。 &#xff08;Thread1生产者&#xff0c;Thread2消费者&#xff09; 实现类 ArrayBlockingQueueLinkedBlockingQueuePr…

软件工程专业就业方向及前景分析

软件工程专业作为一门应用广泛且持续发展的学科&#xff0c;其就业方向多样&#xff0c;就业前景十分乐观&#xff0c;以下是上大学网&#xff08;www.sdaxue.com)整理的软件工程专业一些主要的就业方向及该领域的总体前景分析&#xff0c;供大家参考&#xff01; 就业方向&…

一文理解前端如何调用后端(java)方法

阅读完文章大约需要3~5分钟 文章目录 一、什么是后端方法路径&#xff1f;二、ajax、axios调用后端方法总结 一、什么是后端方法路径&#xff1f; 这里针对的是 java 后端项目中在 controller 文件夹中的类文件&#xff0c;这类文件的后缀一般都会带有 controller&#xff0c…

如何远程访问连接管理器?

远程访问连接管理器是一种方便的工具&#xff0c;可以实现远程访问计算机和网络设备的功能。它使用户能够从任何地点连接到远程计算机&#xff0c;并进行文件传输、桌面共享和远程控制等操作。远程访问连接管理器不仅提供了便利性&#xff0c;还能提高工作效率&#xff0c;并为…

【Vue 2.x】学习vue之二组件

文章目录 Vue二组件第五章es6文件导入出1、导出export 组件&#xff08;component&#xff09;1、定义2、模块化与组件化3、组件的分类1、非单文件组件非单文件三步骤创建组件标准写法简化写法组件的嵌套非单文件的不足之处 2、单文件组件vue单文件组件的使用脚手架创建项目重点…

(学习日记)2024.05.09:UCOSIII第六十三节:常用的结构体(os.h文件)第二部分

之前的章节都是针对某个或某些知识点进行的专项讲解&#xff0c;重点在功能和代码解释。 回到最初开始学μC/OS-III系统时&#xff0c;当时就定下了一个目标&#xff0c;不仅要读懂&#xff0c;还要读透&#xff0c;改造成更适合中国宝宝体质的使用方式。在学完野火的教程后&a…

【JavaEE】线程的概念

文章目录 1、什么是线程2、进程和线程的区别3、多线程的概述4、在Java中实现多线程的方法1.继承Thread类2.实现Runnable接口3.使用匿名内部类来继承Thread类&#xff0c;实现run方法4.使用匿名内部类来实现Runnable接口&#xff0c;实现run方法5.使用 lambda表达式 1、什么是线…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

基于alpha shapes的边缘点提取(matlab)

1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点&#xff0c;可快速准确提取边界点。如下图所示&#xff0c;对于任意形状的平面点云&#xff0c;若一个半径为a的圆&#xff0c;绕其进行滚动&…

类加载子系统之类的生命周期(待完善)

0、前言 文中大量图片来源于 B站 黑马程序员 0.1、类加载子系统在 JVM 中的位置 类加载器负责的事情是&#xff1a;加载、链接、解析 0.2、与类的生命周期相关的虚拟机参数 参数描述-XX:TraceClassLoading打印出加载且初始化的类 1、类的生命周期 堆上的变量在分配空间的时…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验&#xff1a;搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块&#xff0c;如…