x的平方根 二分查找
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
思路:
这个题只需要精确到整数,所以并不算很麻烦。
寻找这个整数解的最简单的想法就是从1开始遍历至x,计算遍历数的平方与x的大小,当某个数平方大于x时,这个数的前一个就是结果。当然,这样逐一遍历的方式复杂度是O(n),遇到复杂测试用例会超过时间限制。
而反观上面这一基本思路的本质是什么,不就是在排序数组中搜索某一个数吗?这种场景可以用什么算法?二分查找。
我们通过二分查找的办法,每次都快速选择出一个数,将它的平方与目标值比较,如果大于目标值,则当前值肯定不是结果,就换到更小的区间,即right=mid-1;如果小于目标值,则当前值有可能是结果,所以我们就先将它赋值给结果res,然后换更大的区间来进一步尝试有没有比它更大的且满足条件的值,即left=res+1。
总之,这里的二分查找对待:mid**2大于x时,是直接向下逼近;而当mid**2大小于x时,是先将结果保存,再向上逼近。
这样,若没有直接命中而提前返回,当迭代到left==right时,结果res一定是最逼近真正结果的值。
代码:
class Solution(object):
def mySqrt(self, x):
left=0 #定义二分查找的左右边界left为0,right为x
right = x
res=None
while(left<=right):#当left<=right,二分查找固定写法
mid = left+(right-left)//2#等同于(left+right)//2
if mid**2==x:#如果直接找到了,就返回
return mid
if mid**2>x:#如果当前值平方大于x,就缩小,向下逼近
right=mid-1
elif mid**2<x:#如果当前值小于x,
res = mid# 先保存当前值作为目前结果
left=res+1#再向上逼近
return res
小结:
二分查找的使用是非常广泛的,这道题通过二分查找就可以将搜索复杂度从O(n)降至O(log2n)。这道题使用二分查找时,要根据实际情况稍微进行调整,对不同情况有个区分。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了