这道题涉及到在一个部分旋转的有序数组中寻找一个特定的元素。解题关键在于如何有效利用数组的部分有序特性来减少搜索范围。首先,通过比较数组首尾元素实现区间的切分。算法首先检查当前左边界元素是否是目标元素,如果是则直接返回。接着,计算中间索引,并检查中间元素是否为目标,如果是则更新右边界为中间,以缩小搜索范围并可能找到最小索引。然后,算法检查左半部分是否有序(即左端元素小于等于右端元素)。根据有序部分的情况,决定是向左还是向右继续搜索,从而不断缩小查找范围。通过这种方式,算法能够在对数时间内找到目标元素或确定其不存在。
时间复杂度: O(log n) in best case, O(n) in worst case
空间复杂度: O(1)
class Solution:
def search(self, arr: List[int], target: int) -> int:
left, right = 0, len(arr) - 1
while left <= right:
if arr[left] == target: # 直接检查左端是否是目标
return left
mid = (left + right) // 2
if arr[mid] == target: # 检查中间元素是否是目标
right = mid # 更新右边界以可能找到更小的索引
continue
if arr[left] == arr[right]: # 处理边界相等的情况
left += 1
continue
# 确定哪一半是有序的
if arr[mid] <= arr[right]: # 右半部有序
if arr[mid] < target <= arr[right]:
left = mid + 1 # 目标在右半部
else:
right = mid - 1 # 目标不在右半部
else: # 左半部有序
if arr[left] <= target < arr[mid]:
right = mid - 1 # 目标在左半部
else:
left = mid + 1 # 目标不在左半部
return -1 # 未找到目标