思路:

本题是一个经典的二分查找问题,但是数组是旋转过的,所以需要先判断哪一部分是有序的,再根据target和有序部分的边界值来判断target在哪个部分,最后进行二分查找。

步骤如下:

  1. 定义左右指针l和r,初始化为数组的左右边界;

  2. 进行二分查找,找到中间位置mid;

  3. 判断mid左边的部分和右边的部分哪部分是有序的,即nums[mid]和nums[l]、nums[r]的大小关系;

  4. 根据target和有序部分的边界值判断target在哪个部分;

  5. 在有序部分中进行二分查找,找到target的下标。

代码如下:

def search(nums: list[int], target: int) -> int:
    l = 0
    r = len(nums) - 1
    while l <= r:
        mid = (l + r) // 2
        # 判断mid左边的部分和右边的部分哪部分是有序的
        if nums[mid] < nums[l]:
            # 右边有序
            if nums[mid] <= target <= nums[r]:
                l = mid
            else:
                r = mid - 1
        else:
            # 左边有序
            if nums[l] <= target <= nums[mid]:
                r = mid
            else:
                l = mid + 1
    if l == len(nums) or nums[l] != target:
        return -1
    return l
Python 实现旋转数组中的目标值查找算法

原文地址: https://www.cveoy.top/t/topic/oeZD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录