1:题目描述(力扣)
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
2:解题思路
完全平方数:如果一个自然数a是某一个整数b的平方,那么这个自然数a叫做完全平方数。零也可称为完全平方数。例如:16是4的平方,16就是一个完全平方数。
使用二分法解法:
第一步:确定左右边界,left,right=1,num/2+1,因为num为正整数,num的平方根一定落在区间[1,num/2+1]内,所以左右边界分别取1,num/2+1,而不是取0,num,这样可以缩小查询范围。
第二步:当left <= right时,进入循环,获取中间元素mid=(left+right)//2,当mid>num/mid,需要修改右边界值,right=mid-1,当mid<num/mid,需要修改左边界值,left=mid+1,当mid=num/mid,说明num是一个完全平方数,返回True。
第三步:在第二步中,没有找到一个符合的整数,则返回False
说明:为什么初始化right=num/2+1,而不是right=num/2
right=num/2,因为当num=1时,left=1,right=0.5,,left>right,会直接退出循环,导致出现1不是完全平方数的错误。
代码展示:
class Solution:
def isPerfectSquare(self, num):
left, right = 1, num/2+1
while left <= right:
mid = (left + right)//2
if mid > num/mid:
right = mid - 1
elif mid < num/mid:
left = mid + 1
else:
return True
return False