Leetcode May Challenge - 05/09: Valid Perfect Square(Python)

题目描述

Given a positive integer num, write a function which returns True if num is a perfect square else False.

Note: Do not use any built-in library function such as sqrt.

例子

Example 1:

Input: 16
Output: true

Example 2:

Input: 14
Output: false

解释

给一个数字,要求在不用sqrt等自带函数的情况下,判断该数字是否是完全平方数。

思路 二分查找

我先试了暴力解法,即从0到num / 2 + 2一个一个试,然后就超时了。所以想到了进一步的优化:二分查找。
还是把初始的左右边界定为left = 0和right = num / 2 + 2。有边界这样定的原因是要把num = 1和num = 2这两种情况包含进去。然后我们分别算left,right,mid = (left + right) // 2的平方是否为num。如果是,直接返回True。否则如果mid的平方比num大,则右边界更新为mid - 1,反之左边界更新为mid + 1。这里要注意,终止条件就是如果left比right大了,说明已经找完了所有数字且都没有符合条件,所以返回False。

代码

class Solution(object):
    def isPerfectSquare(self, num):
        """
        :type num: int
        :rtype: bool
        """
        l = 0
        r = num // 2 + 2
        return self.binary_search(num, l, r)
    
    def binary_search(self, num, l, r):
        if l > r:
            return False
        m = (l + r) // 2
        if l ** 2 == num or r ** 2 == num or m ** 2 == num:
            return True
        if m ** 2 < num:
            return self.binary_search(num, m + 1, r)
        else:
            return self.binary_search(num, l, m - 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值