二分查找-69.x的平方根

embedded/2024/10/18 15:05:45/

题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

69. x 的平方根 - 力扣(LeetCode)

思路讲解

计算非负整数x的算术平方根的整数部分,如果不使用任何内置的指数函数或算符,我们可以采用暴力解法(也称为直接法或枚举法)。这种方法的基本思路是从0开始逐个尝试,直到找到一个数,其平方不超过x,并且这个数的下一个数的平方会大于x

int mySqrt(int x) {  if (x == 0) return 0; // 特殊情况处理  for (int i = 1; i <= x; ++i) {  if (i * i <= x && (i + 1) * (i + 1) > x) {  // 找到i,使得i*i <= x且(i+1)*(i+1) > x  // 直接返回i即可,因为题目要求只保留整数部分  return i;  }  }  // 理论上这行代码不会被执行到,因为上面的循环肯定会找到满足条件的i  // 但为了代码的完整性,还是加上这一行  return -1; // 返回一个不可能的值,表示出错(实际上这种情况不会发生)  
}  

但是,直接遍历从0到x的所有数是非常低效的。为了计算非负整数x的算术平方根的整数部分,我们可以采用二分查找法。考虑到平方根的性质,我们可以设定一个查找范围从0到x(因为x的平方根肯定小于或等于x),并在这个范围内进行二分查找。

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

实现步骤:

  1. 边界条件检查
    • 首先,函数检查输入 x 是否小于 1。如果是,那么 x 的平方根整数部分必然是 0(因为 0 和 1 的平方根整数部分都是 0),所以直接返回 0。
  2. 初始化二分查找的边界
    • 接着,函数初始化两个指针(或索引)left 和 right,分别指向查找范围的左右边界。由于平方根的值至少为 0(对于非负整数 x),且最大不超过 x(因为 sqrt(x) * sqrt(x) = x),所以 left 被初始化为 1(因为 0 的情况已经在边界条件中处理过了),right 被初始化为 x
  3. 执行二分查找
    • 函数进入一个 while 循环,条件是 left < right。这个循环会一直执行,直到 left 和 right 相等,此时它们就指向了平方根的整数部分(或者比它大1的最小整数,但在接下来的步骤中会被正确处理)。
    • 在每次循环中,函数计算中点 mid。这里使用了 long long 类型来存储 mid,以防止在计算 mid * mid 时发生整数溢出。计算 mid 时使用了 (right - left + 1) / 2,这实际上是一种“向上取整”的除法操作(在整数除法中),但它在这里的主要作用是确保当 left 和 right 相邻时,mid 会等于 right(从而避免无限循环)。
    • 然后,函数检查 mid * mid 与 x 的关系:
      • 如果 mid * mid <= x,说明 mid 可能是我们要找的平方根的整数部分(或者比它大),所以将 left 更新为 mid,继续在右半部分查找。
      • 如果 mid * mid > x,说明 mid 太大了,所以将 right 更新为 mid - 1,在左半部分继续查找。
  4. 返回结果
    • 当 while 循环结束时,left 和 right 相等,且它们指向了平方根的整数部分(因为我们在每次循环中都将范围缩小了,直到无法再缩小为止)。所以,函数返回 left(或 right,因为此时它们是相等的)作为结果。

http://www.ppmy.cn/embedded/98127.html

相关文章

全球最强AI程序员 “Genie” 横空出世

全球最强AI程序员 “Genie” 横空出世 Genie 是什么Genie not just a copilot那么如何训练一名AI工程师呢Genie启动 World’s best AI Software Engineer. Genie is the best AI software engineer in the world by far - achieving a 30% eval score on the industry standard…

浅谈JVM

JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09; JVM是Java程序能够跨平台运行的关键所在。 JVM是一个虚拟的计算机&#xff0c;它模拟了真实计算机的各种硬件功能。其主要作用是加载.class字节码文件&#xff0c;并执行其中的指令。 以下是JVM的一…

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)

多功能智能家居室内灯光控制系统设计与实现 目录&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、项目背景与目标 二、国内外研究现状&#xff1a; 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…

Scrapy入门教程

Scrapy入门教程&#xff1a;打造高效爬虫的第一步 1. 引言 在当今的网络世界中&#xff0c;信息是无价的资源。而爬虫工具则是获取这些资源的有力武器。Scrapy 是 Python 生态系统中最强大的爬虫框架之一&#xff0c;它不仅功能强大&#xff0c;而且易于扩展&#xff0c;适用…

FastHTML:使用 Python 彻底改变 Web 开发

什么是 FastHTML&#xff1f;&#x1f310; FastHTML 是一个现代 Python Web 应用程序框架&#xff0c;其真正目的是让 Python 开发人员轻松进行 Web 开发。它大大减少了对 JavaScript 和 CSS 构建交互式和可扩展 Web 应用程序的依赖。FastHTML 通过使用 Python 对象来表示 HTM…

Snipaste 的一款替代工具 PixPin,支持 gif 截图、长截图和 OCR 文字识别,功能不是一点点强!

Snipaste 的一款替代工具 PixPin&#xff0c;支持 gif 截图、长截图和 OCR 文字识别&#xff0c;功能不是一点点强&#xff01; PixPin 的名字来源于“Pixel Pin”&#xff0c;简单来说是一个截图、贴图的工具&#xff0c;但是 PixPin 以截图和贴图两大功能为核心做了大量的优…

【Pyspark-驯化】一文搞懂Pyspark中表连接的使用技巧

【Pyspark-驯化】一文搞懂Pyspark中表连接的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公众号 &…

黄金市场展望:CPI数据引发关注,技术面看涨

亚市现货黄金行情 8月14日周三&#xff0c;亚市盘中现货黄金价格小幅下跌&#xff0c;目前交投在2462美元/盎司附近。投资者将重点关注即将公布的美国消费者物价指数&#xff08;CPI&#xff09;数据&#xff0c;预计这将对黄金市场产生重大影响。 美联储政策预期与CPI数据 市场…