📌  相关文章
📜  在通过从随机索引反转子数组形成的排序数组中搜索元素(1)

📅  最后修改于: 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)。