二分查找
注意!二分查找时也要注意不变量。 如果你调用输入的是 [left, right](或[left, len(nums)-1]),则你的终止条件是if left > right
。因为你的区间是左闭右闭的,所以当left == right
的时候是有意义的。
367.有效完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
示例 2:
输入:num = 14
输出:false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-perfect-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用二分查找不会超时(刚刚好),如果O(n)复杂度会超时的。
class Solution:
def isPerfectSquare(self, num: int) -> bool:
return self.binary_search(0, num, num)
def binary_search(self, left, right, target):
if left > right:
return False
mid = (left + right) // 2
if mid ** 2 == target:
return True
elif mid ** 2 < target:
return self.binary_search(mid + 1, right, target)
elif mid ** 2 > target:
return self.binary_search(left, mid - 1, target)