news 2026/10/21 9:03:59

Leecode第68题:x的平方根

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leecode第68题:x的平方根

mySqrt 解题思路(二分查找)

题目

求非负整数x的整数平方根(向下取整),即最大的整数r满足r * r <= x。不能使用内置sqrt。

例如:

  • x = 4→2

  • x = 8→2(因为2*2=4 <= 8,3*3=9 > 8)

  • x = 0→0


核心思想:在[0, x]里二分找「最大的可行值」

平方根r一定在[0, x]范围内(x >= 1时r <= x)。这个区间是单调的:

  • 若mid * mid <= x,说明mid可行,答案至少是mid,往右找更大的

  • 若mid * mid > x,说明mid太大,答案在左边

于是可以用二分查找,不断缩小区间,直到锁定答案。


关键:判断条件从「比较大小」变成「比较平方」

普通二分是找nums[mid] == target,这题的「条件」是:

text

mid * mid <= x → mid 是可行解,答案在 mid 或其右边 mid * mid > x → mid 太大,答案在 mid 左边

所以:

python

if mid * mid <= x: left = mid + 1 # mid 可行,尝试更大的 else: right = mid - 1 # mid 太大,往左缩

为什么循环结束后返回right

用while left <= right,循环结束时一定是left = right + 1(left刚越过right)。此时:

  • right是最后一个满足mid*mid <= x的位置→ 就是向下取整的平方根✅

  • left是第一个mid*mid > x的位置→ 是平方根 + 1

所以返回right。

一句话:right停在「可行区的右边界」,left停在「不可行区的左边界」,答案在right。


代码

class Solution: def mySqrt(self, x: int) -> int: left, right = 0, x while left <= right: mid = (left + right) // 2 if mid * mid <= x: left = mid + 1 # mid 可行,往右找更大 else: right = mid - 1 # mid 太大,往左缩 return right # 最大的可行值 = 平方根

执行流程演示

例 1:x = 8(答案 2)

text

left=0, right=8 mid=4: 16>8 → right=3 mid=1: 1<=8 → left=2 mid=2: 4<=8 → left=3 mid=3: 9>8 → right=2 left=3 > right=2 → 结束,return right=2 ✅

例 2:x = 4(答案 2)

text

left=0, right=4 mid=2: 4<=4 → left=3 mid=3: 9>4 → right=2 left=3 > right=2 → 结束,return right=2 ✅

例 3:x = 0(答案 0)

text

left=0, right=0 mid=0: 0<=0 → left=1 left=1 > right=0 → 结束,return right=0 ✅

例 4:x = 1(答案 1)

text

left=0, right=1 mid=0: 0<=1 → left=1 mid=1: 1<=1 → left=2 left=2 > right=1 → 结束,return right=1 ✅

边界与正确性

情况处理
x = 0right=0,返回 0 ✅
x = 1返回 1 ✅
x是完全平方数(4、9、16)返回精确平方根 ✅
x不是完全平方数(8)返回向下取整 ✅
x很大mid*mid在 Python 不会溢出(大整数),其他语言需防溢出

为什么right = x而不是x - 1:x=0时x-1=-1会越界/跳过循环;x=1时x-1=0也边界紧张。用x覆盖[0, x]最安全。


复杂度

  • 时间:O(log x),每次区间减半

  • 空间:O(1),只用几个变量


易错点

易错点错误写法正确
mid公式left + right // 2(left + right) // 2
mid位置在循环外算一次循环内每轮重算
循环条件while left < rightwhile left <= right
return位置写在循环里循环外
返回值return leftreturn right
右边界right = x - 1right = x
比较mid > xmid * mid > x

一句话记忆

在[0, x]里二分,mid*mid <= x就往右找(left=mid+1),否则往左缩(right=mid-1);循环结束left=right+1,返回right即向下取整平方根。判断条件是「平方比较」,不是「大小比较」。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 9:03:23

artcraft:从创意到成品的结构化工作流与个人资产库搭建指南

1. 从“artcraft”这个名字说起&#xff1a;它到底想解决什么问题第一次看到“artcraft”这个标题&#xff0c;我脑子里蹦出来的第一反应是&#xff1a;这大概率是一个把“艺术&#xff08;art&#xff09;”和“手工艺&#xff08;craft&#xff09;”揉在一起的工具或项目。事…

作者头像 李华
网站建设 2026/10/21 9:03:01

diagram-design:用设计系统思维构建可复用图表模板

1. 从一张草图到一套系统&#xff1a;diagram-design 到底在解决什么问题第一次听到 diagram-design 这个词&#xff0c;很多人会下意识觉得它只是“画图”的另一种说法。但真正在项目里被图表折磨过的人知道&#xff0c;画图本身从来不是难点&#xff0c;难的是让图表在三个月…

作者头像 李华
网站建设 2026/10/21 9:02:58

STM32 HAL库驱动ADS124S08高精度ADC实战指南

简介&#xff1a;面向STM32嵌入式开发者&#xff0c;这份基于HAL库的ADS124s08驱动例程提供了一套完整的SPI通信与数据采集实现方案。ADS124s08是一款24位高精度、低噪声的Σ-Δ模数转换器&#xff0c;内置可编程增益放大器&#xff0c;能处理微伏级输入信号&#xff0c;配合ST…

作者头像 李华
网站建设 2026/10/21 9:02:12

代码审计、漏洞扫描与渗透测试:安全测试报告的核心技术拆解

做软件交付这些年&#xff0c;我最常写的文档就是安全测试报告&#xff0c;也是被追问最多的文档。很多人以为安全测试就是拿工具扫一遍、导出一份 PDF、修掉几个高危就完事&#xff0c;但真正经得起评审和复测的报告&#xff0c;核心工作落在三块技术上&#xff1a;代码审计、…

作者头像 李华
网站建设 2026/10/21 9:01:27

圆柱电池环保审核提效:IACheck与AI协同的合规实战

这段时间我一直在处理圆柱体电池检测认证相关的审核工作&#xff0c;办公室桌上堆着的检测报告一本比一本厚&#xff0c;18650、21700、32650这些型号的环保合规材料摞起来比词典还夸张。按老办法&#xff0c;审核员要逐份核对有害物质限值、材料申报清单、豁免条款说明&#x…

作者头像 李华
网站建设 2026/10/21 9:00:51

olcNES 6502 CPU模拟器实现与代码拆解

&#xff1a;把 olcNES 项目读到 CPU 这块时&#xff0c;我最大的感受是&#xff1a;模拟器最核心的部分其实不是“还原一台机器”&#xff0c;而是“用软件的方式重写一套硬件行为”。6502 CPU 模拟代码就是这套行为的骨架。这篇 Part#2 学习记录&#xff0c;我会从 6502 的寄…

作者头像 李华