leetcode NO.69_x 的平方根 白痴讲解

在这里插入图片描述

一个数 x 的开方 sqrt 一定在 0 ~ x 之间,并且满足 sqrt == x / sqrt 。可以利用二分查找在 0 ~ x 之间查找 sqrt。

class Solution:
    def mySqrt(self, x: int) -> int:
        if x <= 1:
            return x;
        l = 1;
        h = x;
        while l <= h:
            mid = l + (h - l) // 2;
            sqrt = x / mid;
            if sqrt == mid:
                return mid;
            else:
                if sqrt < mid:
                    h = mid - 1;
                else: 
                    l = mid + 1;
        return h;

思想就是if s q r t &lt; m i d sqrt &lt; mid sqrt<mid:,说明 m i d ∗ m i d &gt; x mid*mid&gt;x midmid>x,要让 m i d mid mid变小一点,于是 h = m i d − 1 h = mid - 1 h=mid1;,下次 m i d = l + ( h − l ) / / 2 mid = l + (h - l) // 2 mid=l+(hl)//2;的时候 m i d mid mid才会变小,
同理if s q r t &gt; m i d sqrt &gt; mid sqrt>mid:,说明 m i d ∗ m i d &lt; x mid*mid&lt;x midmid<x了,要让 m i d mid mid变大一点,于是 l = m i d + 1 l = mid + 1 l=mid+1;,当两个界 l o w low low h i g h high high重叠时,即 l = h l=h l=h,那么此时的 m i d ∗ m i d mid*mid midmid是大于 x x x且最近接 x x x的数,于是 h − 1 h-1 h1即为所求。

最后必将收敛到 l = k , h = k + 1 l=k,h=k+1 l=k,h=k+1的形式,因为x会夹在两个平方数 k 2 k^2 k2 ( k + 1 ) 2 (k+1)^2 k+12之间,最后 m i d = k , m i d 2 &lt; x mid=k,mid^2&lt;x mid=k,mid2<x,对应 s q r t &lt; m i d sqrt&lt;mid sqrt<mid h = k h=k h=k,return h h h正合适

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值