leetcode(16)二分查詢系列題目
阿新 • • 發佈:2022-05-17
69. x 的平方根
class Solution: def mySqrt(self, x: int) -> int: left, right = 0, x while left <= right: mid = (left + right) // 2 if mid * mid == x: return mid elif mid * mid < x: left = mid + 1 else: right = mid - 1 return right # 沒找到則返回最大的一個平方小於x的即退出迴圈的right
633. 平方數之和
class Solution: def judgeSquareSum(self, c: int) -> bool: i = 0 while i*i <= c: i += 1 left, right = 0, i while left <= right: sum_ =left*left + right*right if sum_ == c: return True elif sum_ < c: left += 1 else: right -= 1 return False
# 暴力法 class Solution: def judgeSquareSum(self, c: int) -> bool: nums = set() i = 0 while i*i <= c: nums.add(i*i) i += 1 # print(nums) for n in nums: if (c - n) in nums: return True return False
33. 搜尋旋轉排序陣列
先判斷左邊有序且target在左邊,則收縮右邊界
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums:
return -1
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if target == nums[mid]:
return mid
elif nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1