1. 程式人生 > 其它 >leetcode(16)二分查詢系列題目

leetcode(16)二分查詢系列題目

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