33-搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

  1. 你可以假设数组中不存在重复的元素。

  2. 你的算法时间复杂度必须是 O(log n) 级别。


示例

示例 1:

输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:

输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

解法

核心思路:使用二分法。关键点在与找到转折点T与mid点的关系,判断target是否在升序的那一部分中来更新left和right的值。

class Solution:
def search(self, nums: List[int], target: int) -> int:
mid, left, right = 0, 0, len(nums)-1
while left <= right: # 二分法
mid = (left + right) // 2

# 判断mid点是否为所求点
if nums[mid] == target:
return mid

# 旋转点T在mid右区间
# [left......mid....T....right]
if nums[left] <= nums[mid]:
# target在[left,mid)的升序空间中
if nums[left] <= target < nums[mid]:
right = mid
# target在(mid,T]或者[T,right]中
else:
left = mid + 1

# 旋转点T在mid左区间
# [left...T...mid........right]
elif nums[left] > nums[mid]:
# target在(mid,right]的升序空间中
if nums[mid] < target <= nums[right]:
left = mid + 1
# target在[left,T]或者[T,mid)
else:
right = mid
# 未找到该点
return -1

来源

LeetCode中该题地址,Click here!

-------------本文结束感谢您的阅读-------------