原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvyz1t/
解法一(python)
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right)//2
if nums[mid] == target:
return mid
if 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
思路:我们可以首先判断中间元素 mid 和左端点元素 left 的大小关系,如果 mid 大于等于 left,则说明左半边是有序的,右半边是无序的;反之则说明右半边是有序的,左半边是无序的。然后根据 target 和有序的那一半端点元素的大小关系来确定查找范围。