# 33. Search in Rotated Sorted Array #### Difficulty: Medium link: https://leetcode.com/problems/search-in-rotated-sorted-array/ ### 1. Binary Search #### $O(log\ n)$ runtime, $O(1)$ space 題目限制$O(log\ n)$複雜度,所以想到用binary search,套用binary search模板。 由於條件比較複雜,先討論各種情況。 ##### python ```python= class Solution: def search(self, nums: List[int], target: int) -> int: def feasible(mid): # sorted array if nums[0] <= nums[-1]: return target <= nums[mid] # rotated array else: if nums[0] <= target: return target <= nums[mid] or nums[mid] < nums[0] else: return target <= nums[mid] < nums[0] left, right = 0, len(nums) - 1 while left < right: mid = left + (right - left) // 2 if feasible(mid): right = mid else: left = mid + 1 if nums[left] == target: return left else: return -1 ``` 簡化版如下。 ##### python ```python= class Solution: def search(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 while left < right: mid = left + (right - left) // 2 if nums[0] <= target <= nums[mid] or nums[mid] < nums[0] <= target or target <= nums[mid] < nums[0]: right = mid else: left = mid + 1 return left if nums[left] == target else -1 ``` 討論區的想法很棒,把rotated過的部分視為inf和-inf,參考[這篇](https://leetcode.com/problems/search-in-rotated-sorted-array/discuss/14435/Clever-idea-making-it-simple)。 * If target is let's say 14, then we adjust nums to this, where "inf" means infinity: * [12, 13, 14, 15, 16, 17, 18, 19, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf] * If target is let's say 7, then we adjust nums to this: * [-inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] ###### tags: `leetcode`