Leetcode # 81. Search in Rotated Sorted Array II
- 2023.08.10
- ★★ Medium Binary Method / Divide and Conquer LeetCode
https://leetcode.com/problems/search-in-rotated-sorted-array-ii
Solution
Leetcode # 33. Search in Rotated Sorted Array 的 solution
配合題目修改了 input 跟 output
class Solution: def search(self, nums: List[int], target: int, left=0, right=-1) -> bool: right += len(nums) if right < 0 else 0 while left <= right: mid = (left + right) // 2 if target == nums[mid]: return True elif nums[mid] < nums[left] and nums[mid] < nums[right]: if nums[mid] < target <= nums[right]: left = mid + 1 else: right = mid - 1 # nums[mid] >= nums[left] else: if nums[left] <= target <= nums[mid]: right = mid - 1 else: left = mid + 1 return False
nums
從 ascending order 變為 non-decreasing order
所以針對下列兩種情況進行修改
nums[left] == nums[mid] == nums[right]
此時無法進行下一步的 binary search
分別對子序列 nums[left + 1: mid] 和 nums[mid + 1: right] 執行 search
這導致了 time complexity 最壞情況為 O(len(nums))- 本來只有 left == mid == right 時,nums[mid] == nums[right] 才會發生
但現在nums
是 non-decreasing order
因應此變化修正了 nums[mid] < nums[left] and nums[mid] <= nums[right]
Time Complexity:
n := len(nums)
Best Case: O(log(n))
Worst Case: O(n)
Space Complexity: O(1)
(The input and output generally do not count towards the space complexity.)
class Solution: def search(self, nums: List[int], target: int, left=0, right=-1) -> bool: right += len(nums) if right < 0 else 0 while left <= right: mid = (left + right) // 2 print(f"{left}: {nums[left]}, {mid}: {nums[mid]}, {right}: {nums[right]}") if target == nums[mid]: return True if nums[left] == nums[mid] == nums[right]: return False if right- left <= 2 else \ (self.search(nums, target, left + 1, mid) \ or self.search(nums, target, mid + 1, right)) elif nums[mid] < nums[left] and nums[mid] <= nums[right]: if nums[mid] < target <= nums[right]: left = mid + 1 else: right = mid - 1 # nums[mid] >= nums[left] else: if nums[left] <= target <= nums[mid]: right = mid - 1 else: left = mid + 1 return False
Last Updated on 2023/08/16 by A1go