leetcode 69. x 的平方根
可以使用二分查找法或牛顿迭代法来实现 LeetCode 问题 69. x 的平方根。下面是使用二分查找法和牛顿迭代法的 C++ 实现。
二分查找法
#include <iostream>class Solution {
public:int mySqrt(int x) {if (x == 0) return 0;int left = 1, right = x, ans = 0;while (left <= right) {int mid = left + (right - left) / 2;if (mid <= x / mid) {ans = mid;left = mid + 1;} else {right = mid - 1;}}return ans;}
};int main() {Solution solution;int x = 8;std::cout << "The square root of " << x << " is " << solution.mySqrt(x) << std::endl;return 0;
}
牛顿迭代法
#include <iostream>class Solution {
public:int mySqrt(int x) {if (x == 0) return 0;double x0 = x;while (true) {double xi = 0.5 * (x0 + x / x0);if (abs(x0 - xi) < 1e-7) break;x0 = xi;}return static_cast<int>(x0);}
};int main() {Solution solution;int x = 8;std::cout << "The square root of " << x << " is " << solution.mySqrt(x) << std::endl;return 0;
}
解释
二分查找法
- 初始化:定义
left
为 1,right
为x
,并初始化ans
为 0。 - 循环:当
left
小于等于right
时,计算mid
作为中间值。 - 判断:如果
mid
的平方小于等于x
,说明mid
可能是平方根的一部分,更新ans
为mid
,并移动left
到mid + 1
。否则,移动right
到mid - 1
。 - 返回:循环结束后,返回
ans
。
牛顿迭代法
- 初始化:定义
x0
为x
。 - 迭代:计算
xi
,它是x0
和x / x0
的平均值。如果x0
和xi
的差异小于一个很小的值(如1e-7
),则停止迭代。 - 更新:将
x0
更新为xi
。 - 返回:将
x0
转换为整数并返回。
这两种方法都能有效地计算 x
的平方根,并且二分查找法的时间复杂度为 O(log x)
,牛顿迭代法的时间复杂度为 O(log x)
。你可以根据需要选择其中一种方法。
当然,使用图示和例子可以更直观地理解二分查找算法在计算平方根整数部分的过程。
例子:计算 10 的平方根的整数部分
我们以计算 10 的平方根为例,来展示整个过程。
步骤 1:初始化
left = 1
right = 10
ans = 0
步骤 2:开始二分查找
-
第一次迭代:
- 计算中点
mid = left + (right - left) / 2 = 1 + (10 - 1) / 2 = 5
- 检查
mid * mid
和x
的关系:5 * 5 = 25
,25 > 10,因此更新right
为mid - 1
,即right = 4
- 图示:
搜索区间: [1, 10] mid = 5, 5*5 > 10, 更新right = 4
- 计算中点
-
第二次迭代:
- 计算中点
mid = left + (right - left) / 2 = 1 + (4 - 1) / 2 = 2
- 检查
mid * mid
和x
的关系:2 * 2 = 4
,4 < 10,因此更新ans
为mid
,并更新left
为mid + 1
,即left = 3
- 图示:
搜索区间: [1, 4] mid = 2, 2*2 < 10, 更新left = 3, ans = 2
- 计算中点
-
第三次迭代:
- 计算中点
mid = left + (right - left) / 2 = 3 + (4 - 3) / 2 = 3
- 检查
mid * mid
和x
的关系:3 * 3 = 9
,9 < 10,因此更新ans
为mid
,并更新left
为mid + 1
,即left = 4
- 图示:
搜索区间: [3, 4] mid = 3, 3*3 < 10, 更新left = 4, ans = 3
- 计算中点
-
第四次迭代:
- 计算中点
mid = left + (right - left) / 2 = 4 + (4 - 4) / 2 = 4
- 检查
mid * mid
和x
的关系:4 * 4 = 16
,16 > 10,因此更新right
为mid - 1
,即right = 3
- 图示:
搜索区间: [4, 4] mid = 4, 4*4 > 10, 更新right = 3
- 计算中点
结束循环
当 left
> right
时,退出循环,此时 ans
保存的就是最大的满足条件的整数。最终结果为 ans = 3
,所以 10 的平方根的整数部分是 3。
代码对应的流程
- 初始化
left
、right
和ans
- 在每次迭代中计算
mid
并比较mid * mid
和x
- 如果
mid * mid
小于等于x
,则更新ans
并右移left
- 如果
mid * mid
大于x
,则左移right
- 如果
- 循环结束后,返回
ans
图示
初始区间: [1, 10]第一次迭代:
mid = 5, 5*5 > 10, 更新right = 4
搜索区间变为: [1, 4]第二次迭代:
mid = 2, 2*2 < 10, 更新left = 3, ans = 2
搜索区间变为: [3, 4]第三次迭代:
mid = 3, 3*3 < 10, 更新left = 4, ans = 3
搜索区间变为: [4, 4]第四次迭代:
mid = 4, 4*4 > 10, 更新right = 3
搜索区间变为: [4, 3]循环结束,返回 ans = 3
这样,通过二分查找,我们成功找到并返回了 10 的平方根的整数部分 3。
相关文章:
leetcode 69. x 的平方根
可以使用二分查找法或牛顿迭代法来实现 LeetCode 问题 69. x 的平方根。下面是使用二分查找法和牛顿迭代法的 C 实现。 二分查找法 #include <iostream>class Solution { public:int mySqrt(int x) {if (x 0) return 0;int left 1, right x, ans 0;while (left <…...

基于词级ngram的词袋模型对twitter数据进行情感分析
按照阿光的项目做出了学习笔记,pytorch深度学习实战项目100例 基于词级ngram的词袋模型对twitter数据进行情感分析 什么是 N 符? N 格是指给定文本或语音样本中 n 个项目的连续序列。这些项目可以是音素、音节、字母、单词或碱基对,具体取…...
Linux-Centos-改密码(单用户登陆)
笔记一: centos7单用户修改root密码 在CentOS 7中,如果您是唯一的用户或者您确信其他用户不会登录,您可以按照以下步骤来修改root密码: 1.重启系统。 2.启动时出现引导界面时,按任意键进入GRUB菜单。 3.选择要启动的内…...

java实现OCR图片识别,RapidOcr开源免费
先看一下识别效果(自我感觉很牛逼),比Tess4J Tesseract省事,这个还需要训练,安装软件、下载语言包什么的 很费事,关键识别率不高 RapidOcr不管文字的横竖,还是斜的都能识别(代码实现…...

PCB工艺边设计准则
在PCB设计时,通常会在电路板的边缘预留一定的空间,这部分空间被称为工艺边。它有助于在生产过程中确保电路板的尺寸和形状的准确性。以使得组装时更加顺畅、便捷。而工艺边的加工,使得线路板上的元件可以精准地与设备对接,从而提高…...

CTF-NSSCTF题单[GKCTF2020]
[GKCTF 2020]CheckIN 这道题目考察:php7-gc-bypass漏洞 打开这道题目,开始以为考察反序列化,但实际并不是,这里直接用$_REQUEST传入了参数便可以利用了。这里出现了一个eval()函数,猜测考察命…...
redis的分片集群(仅供自己参考)
前言:为什么使用分片集群:因为redis的主从和哨兵机制主要是用来解决redis的高并发读的问题,还有redis的高并发的写的问题没有解决。使用分片集群就可以很好的解决redis写的问题,有多个master就可以实现并发的写。同时,…...

自动驾驶-机器人-slam-定位面经和面试知识系列01之常考公式推导(01)
李群李代数扰动bundle adjustment 这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新,基本涵盖了自己秋招历程被问过的面试内容(除了实习和学校项目相关的具体细节)。在知乎和牛客也会同步更新,全网…...
netty入门-5 ServerBootstrap与Bootstarp
前言 本来这篇应该紧接着说明Future和Promise。 但是考虑前文第三篇即用到了ServerBootstrap来启动一个服务器,并且我读的闪电侠netty,先写的服务器与客户端启动这部分。索性就先写出来了。主要内容来自闪电侠netty ServerBootstrap ServerBootstrap就…...

JavaEE - Spring Boot 简介
1.Maven 1.1 什么是Maven 翻译过来就是: Maven是⼀个项⽬管理⼯具。基于POM(Project Object Model,项⽬对象模型)的概念,Maven可以通 过⼀⼩段描述信息来管理项⽬的构建,报告和⽂档的项⽬管理⼯具软件。 可以理解为:Maven是一个项目管理工具…...
SwiftUI革新:Xcode UI开发的新纪元
SwiftUI革新:Xcode UI开发的新纪元 SwiftUI作为Apple推出的声明式UI框架,彻底改变了在Xcode中构建用户界面的方式。它不仅简化了代码,还提高了开发效率,并且使得UI设计更加直观和灵活。本文将深入探讨如何在Xcode中使用SwiftUI进…...
22、基于共享内存的数据结构——用十个块来提高并发性
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 为了提高并发性,把…...

【ffmpeg命令入门】实现画中画
文章目录 前言画中画是什么画中画的外观描述效果展示为什么要用画中画应用场景示例 使用FFmpeg添加画中画示例命令参数解释调整嵌入视频的位置调整嵌入视频的大小处理音频 总结 前言 FFmpeg 是一款强大的多媒体处理工具,广泛用于音视频的录制、转换和流处理。它不仅…...
基于 LangChain+LangGraph 来实现一个翻译项目
相信大家在看文档的时候,有时会比较苦恼,比如 AI 相关的文档都是外文,中文文档比较少,看起来会比较吃力,有的时候会看不懂,翻译软件又翻得很乱,完全看不了,今天就基于 LangChain 和 …...
javascript 如何将 json 格式数组转为 excel 表格| sheetJS
案例 // https://unpkg.com/xlsx0.18.5/dist/xlsx.full.min.js function exportXlsx(jsonData, fileName , mine null) {const workbook XLSX.utils.book_new();// 将JSON数组转换成工作表const worksheet XLSX.utils.json_to_sheet(jsonData);// 向工作簿添加工作表XLSX.…...
网页制作技术在未来会如何影响人们的生活?
网页制作技术在未来会如何影响人们的生活? 李升伟 网页制作技术在未来可能会从以下几个方面显著影响人们的生活: 1. 工作与学习方式的变革:远程办公和在线教育将更加普及和高效。通过精心制作的网页,人们能够实现更便捷的协作…...

【计算机网络】网络层——IPv4地址(个人笔记)
学习日期:2024.7.24 内容摘要:IPv4地址,分类编址,子网,无分类编址 IPv4地址概述 在TCP/IP体系中,IP地址是一个最基本的概念,IPv4地址就是给因特网上的每一台主机的每一个接口分配一个在全世界…...
c++ 学习笔记之多线程:线程锁,条件变量,唤醒指定线程
基于CAS线程加锁方式 CAS(Compare-And-Swap)和 mutex 都是用于实现线程安全的技术,但它们适用于不同的场景,具有不同的性能和复杂性。下面是对两者的区别和使用场景的详细解释: CAS(Compare-And-Swap&…...

《0基础》学习Python——第二十三讲__网络爬虫/<6>爬取哔哩哔哩视频
一、在B站上爬取一段视频(B站视频有音频和视频两个部分) 1、获取URL 注意:很多平台都有反爬取的机制,B站也不例外 首先按下F12找到第一条复制URL 2、UA伪装,下列图片中(注意代码书写格式) 3、Co…...

第13周 简历职位功能开发与Zookeeper实战
第13周 简历职位功能开发与Zookeeper实战 本章概述1. Mysql8窗口函数over使用1.1 演示表结构与数据1.2 案例1:获取男女总分数1.3 案例2****************************************************************************************本章概述 1. Mysql8窗口函数over使用 参考案例…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...