📅  最后修改于: 2023-12-03 15:37:47.290000             🧑  作者: Mango
这个题目是 LeetCode 上的题目33,题目描述为:假设按照升序排序的数组在预先知道的某个点上进行了旋转。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
这个题目的难点在于数组非常有规则的旋转,在旋转后的数组上进行查找。因此,我们需要确定数组中哪一部分是有序的,哪一部分是被旋转的。
可以通过比较数组中的中间元素与目标值之间的大小关系,判断哪一部分是有序的。如果中间元素比目标值大,那么右半区间是有序的,否则左半区间是有序的。当确定了哪一部分是有序的后,就可以在有序的区间进行二分查找了。
下面是 Python 代码实现:
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums:
return -1
if len(nums) == 1:
return 0 if nums[0] == target else -1
left, right = 0, 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
代码中使用了两个指针 left 和 right,表示当前查找的区间。在每一次循环中,都去判断 mid 是否等于 target,如果等于直接返回 mid,否则就判断哪一部分是有序的,进行二分查找。
代码的时间复杂度为 O(log n),空间复杂度为 O(1)。