当前位置: 首页 > news >正文

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;
}

解释

二分查找法
  1. 初始化:定义 left 为 1,rightx,并初始化 ans 为 0。
  2. 循环:当 left 小于等于 right 时,计算 mid 作为中间值。
  3. 判断:如果 mid 的平方小于等于 x,说明 mid 可能是平方根的一部分,更新 ansmid,并移动 leftmid + 1。否则,移动 rightmid - 1
  4. 返回:循环结束后,返回 ans
牛顿迭代法
  1. 初始化:定义 x0x
  2. 迭代:计算 xi,它是 x0x / x0 的平均值。如果 x0xi 的差异小于一个很小的值(如 1e-7),则停止迭代。
  3. 更新:将 x0 更新为 xi
  4. 返回:将 x0 转换为整数并返回。

这两种方法都能有效地计算 x 的平方根,并且二分查找法的时间复杂度为 O(log x),牛顿迭代法的时间复杂度为 O(log x)。你可以根据需要选择其中一种方法。

当然,使用图示和例子可以更直观地理解二分查找算法在计算平方根整数部分的过程。

例子:计算 10 的平方根的整数部分

我们以计算 10 的平方根为例,来展示整个过程。

步骤 1:初始化
  • left = 1
  • right = 10
  • ans = 0
步骤 2:开始二分查找
  1. 第一次迭代

    • 计算中点 mid = left + (right - left) / 2 = 1 + (10 - 1) / 2 = 5
    • 检查 mid * midx 的关系:5 * 5 = 25,25 > 10,因此更新 rightmid - 1,即 right = 4
    • 图示:
      搜索区间: [1, 10]
      mid = 5, 5*5 > 10, 更新right = 4
      
  2. 第二次迭代

    • 计算中点 mid = left + (right - left) / 2 = 1 + (4 - 1) / 2 = 2
    • 检查 mid * midx 的关系:2 * 2 = 4,4 < 10,因此更新 ansmid,并更新 leftmid + 1,即 left = 3
    • 图示:
      搜索区间: [1, 4]
      mid = 2, 2*2 < 10, 更新left = 3, ans = 2
      
  3. 第三次迭代

    • 计算中点 mid = left + (right - left) / 2 = 3 + (4 - 3) / 2 = 3
    • 检查 mid * midx 的关系:3 * 3 = 9,9 < 10,因此更新 ansmid,并更新 leftmid + 1,即 left = 4
    • 图示:
      搜索区间: [3, 4]
      mid = 3, 3*3 < 10, 更新left = 4, ans = 3
      
  4. 第四次迭代

    • 计算中点 mid = left + (right - left) / 2 = 4 + (4 - 4) / 2 = 4
    • 检查 mid * midx 的关系:4 * 4 = 16,16 > 10,因此更新 rightmid - 1,即 right = 3
    • 图示:
      搜索区间: [4, 4]
      mid = 4, 4*4 > 10, 更新right = 3
      
结束循环

left > right 时,退出循环,此时 ans 保存的就是最大的满足条件的整数。最终结果为 ans = 3,所以 10 的平方根的整数部分是 3。

代码对应的流程

  1. 初始化 leftrightans
  2. 在每次迭代中计算 mid 并比较 mid * midx
    • 如果 mid * mid 小于等于 x,则更新 ans 并右移 left
    • 如果 mid * mid 大于 x,则左移 right
  3. 循环结束后,返回 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。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++里memset的使用
  • Oracle 文件管理-参数文件、控制文件、归档
  • Java语言程序设计——篇九(3)
  • AspectJWeaver反序列化
  • 数据结构经典测试题4
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二叉树的广度搜索(200分) - 三语言AC题解(Python/Java/Cpp)
  • RabbitMq手动ack的超简单案例+Confirm和Return机制的配置和使用
  • 测试面试宝典(三十三)—— 接口测试有没有测试出什么问题?
  • 二分类、多分类、多标签分类的评价指标
  • 家具购物小程序的设计
  • (源码分析)springsecurity认证授权
  • 简单三步,帮你的照片重现高清,一键拯救摄影废片!
  • STM32——GPIO(点亮LEDLED闪烁)
  • Android中的usescleartexttraffic属性详解
  • 《学会 SpringBoot · 参数校验》
  • 网络传输文件的问题
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Android组件 - 收藏集 - 掘金
  • JavaWeb(学习笔记二)
  • JSONP原理
  • JS变量作用域
  • leetcode讲解--894. All Possible Full Binary Trees
  • node入门
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • SpingCloudBus整合RabbitMQ
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 分享一份非常强势的Android面试题
  • 盘点那些不知名却常用的 Git 操作
  • 区块链共识机制优缺点对比都是什么
  • 驱动程序原理
  • 我这样减少了26.5M Java内存!
  • 小程序开发中的那些坑
  • 回归生活:清理微信公众号
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • # 数论-逆元
  • $().each和$.each的区别
  • (1)Hilt的基本概念和使用
  • (2015)JS ES6 必知的十个 特性
  • (3)STL算法之搜索
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (NSDate) 时间 (time )比较
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (正则)提取页面里的img标签
  • (转)大道至简,职场上做人做事做管理
  • (转)我也是一只IT小小鸟
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET8使用VS2022打包Docker镜像
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .Net中ListT 泛型转成DataTable、DataSet
  • [].slice.call()将类数组转化为真正的数组
  • [《百万宝贝》观后]To be or not to be?