x的平方根 二分查找

69. 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)。这道题使用二分查找时,要根据实际情况稍微进行调整,对不同情况有个区分。

posted @   JunanP  阅读(17)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示