classSolution:defmySqrt(self, x:int)->int:# 思路:二分法,左闭右开# 额外添加1:判断0,1是否符合;if x ==0or x ==1:return x
left , right ,res =0, x ,-1# res 是为了记录返回最小,题解说为-1,防内存溢出?while left < right :
mid = left +(right-left)//2if mid**2<= x:#额外添加2: < → <= 因为返回的值平方小于等于x即可
left = mid +1
res = mid #记录res else:
right = mid
return res
classSolution:defisPerfectSquare(self, num:int)->bool:# 二分法,考虑到需要相等,所以要用左闭右闭;
left , right =0, num-1if num ==1:#下边漏掉了1,因为len-1 直接为0returnTruewhile left <= right:
mid = left +(right-left)//2if mid**2== num :returnTrueelif mid**2< num :
left = mid +1else:
right = mid -1returnFalse
1.左闭右开 + 返回判断
classSolution:defisPerfectSquare(self, num:int)->bool:# 二分法,左闭右开
l,r =1,num #左边改为从1开始,因为为正整数的积while l < r :
mid = l +(r-l)//2if mid**2< num:
l = mid +1else:
r = mid
# 前边就是普通左闭右开二分法,最后一个神来之笔!!!# 比我漏条件 + 多条件 return 好的多 !!! return l*l == num