二分查找法:LeetCode 69 x 的平方根 LeetCode 367

LeetCode 69  这道题是求正整数的平方根,就是求 √x 的值,由于 y = √x 是一个单调递增的函数,因此可以
用二分查找法来查找结果。
class Solution:
    def mySqrt(self, x: int) -> int:
        l = 1
        r = x
        if x == 0 or x == 1:
            return x
        while(l<=r):
            mid = int(l + (r-l)/2)  # 这里也可以用位运算加快速度 mid = l + r >> 1 ,由于+的优先级高于>>,所以括号可以不加
            if mid == x/mid:
                return mid
            if mid < x/mid:
                l = mid + 1
                res = mid     # 注意这个地方是在mid<x/mid的时候,更新res,因为题目要求的是返回一个整数,那么意味着返回的整数必然小于等于该有的结果. 
            if mid > x/mid:
                r = mid - 1
        return res  


# 如果题目要求答案要求向上取正的话就把上述代码的res放到 if mid > x/mid 内部,这样实现从右侧不断逼近真实值,即向上取整,
# 而把res放在 if mid < x/mid 内部,这样实现从左侧不断逼近真实值,即向下取整,而能取整是因为每次mid的增加都是以1为单位并且mid也是一个整数
可以设置精度的sqrt()函数
class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0 or x == 1:
            return x
        
        l = 1 
        r = x
        
        while(abs(l-r)>=0.00001): # 精度为10的-5次方
            mid = (l + (r-l)/2)   # 这种情况下的mid就要保持它是浮点数
            if mid == x/mid:
                return mid        
            if mid < x/mid:        
                l = mid           # 这次的l不需要置为mid+1了,因为此时mid每一次的增加的单位不再是1了,之前表示数组下标或者整数的时候,每次加一。
                res = mid         
            if mid > x/mid:
                r = mid 
        return res        
        
LeetCode 367. 有效的完全平方数
此题就是 69 题的反过程,也是由于 y = √x 是一个单调递增的函数,因此可以用二分查找法来查找结果。
class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        if num == 1 or num == 0:
            return True
        l = 1
        r = num
        while(l<=r):
            mid =int( l + (r - l)/2 )
            if mid == num/mid:
                return True
            elif mid < num/mid:
                l = mid + 1
            elif mid > num/mid:
                r = mid - 1
        return False        
            

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值