题目描述
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)