파이썬 알고리즘 인터뷰 66번(리트코드 33) Search in Rotated Sorted Array
https://leetcode.com/problems/search-in-rotated-sorted-array/
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[mid] == target:
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
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 - left) // 2
if nums[mid] > nums[right]:
left = mid + 1
else:
right = mid
pivot = left
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
mid_pivot = (mid + pivot) % len(nums)
if nums[mid_pivot] < target:
left = mid + 1
elif nums[mid_pivot] > target:
right = mid - 1
else:
return mid_pivot
return -1
pivot을 찾는다.left, right의 절반으로 구한 후 pivot을 더하여 보정한 절반을 이용한다.