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
if nums[mid] > nums[left]: # 左边是有序的
if nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
if target >= nums[left]:
right = mid - 1
else:
left = mid + 1
elif nums[mid] < nums[left]: # 右边是有序的
if nums[mid] > target:
right = mid - 1
else:
if target <= nums[right]:
left = mid + 1
else:
right = mid - 1
else:
left += 1
return -1
class Solution:
def search(self, nums: List[int], target: int) -> bool:
if not nums:
return False
n = len(nums)
if n == 1:
return nums[0] == target
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target: # 符合条件
return True
if nums[mid] > nums[left]: # 左边是有序的
if nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
if target >= nums[left]:
right = mid - 1
else:
left = mid + 1
elif nums[mid] < nums[left]: # 右边是有序的
if nums[mid] > target:
right = mid - 1
else:
if target <= nums[right]:
left = mid + 1
else:
right = mid - 1
else:
left += 1
return False
class Solution:
def findMin(self, nums: List[int]) -> int:
left, right = 0, len(nums) - 1
res = float('inf')
while left<=right:
mid = left + (right - left)//2
res = min(res, nums[mid])
if nums[mid] < nums[left]: # 右边是有序的
res = min(res, nums[mid])
right = mid - 1
else: # 左边是有序的,说明旋转点在右边
res = min(res, nums[left])
left = mid + 1
return res