Leetcode 33. Search in Rotated Sorted Array

Description: There is an integer array nums sorted in ascending order (with distinct values).

Prior to being passed to your function, nums is rotated at an unknown pivot index k (0 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,5,6,7] might be rotated at pivot index 3 and become [4,5,6,7,0,1,2].

Given the array nums after the rotation and an integer target, return the index of target if it is in nums, or -1 if it is not in nums.

Link: 33. Search in Rotated Sorted Array

Examples:

Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

Example 3:
Input: nums = [1], target = 0
Output: -1

思路: 与平常的二分查找不同,有序list被折成两半了。二分查找的目的是确定目标值所在的区间,逐步缩小区间的大小,从而确定index的位置。我们会局限在以往的模式中,去比较nums[mid]和target的关系,但是这次需要考虑这一段区间是否有序,按照题解的思路:

(1)如果target==A[m],那么m就是我们要的结果,直接返回;
(2)如果A[m]<A[r],那么说明从m到r一定是有序的(没有受到rotate的影响),那么我们只需要判断target是不是在m到r之间,如果是则把左边缘移到m+1,否则就target在另一半,即把右边缘移到m-1。
(3)如果A[m]>=A[r],那么说明从l到m一定是有序的,同样只需要判断target是否在这个范围内,相应的移动边缘即可。

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if not nums: return -1
        n = len(nums)
        l, r = 0, n-1
        while l <= r:
            mid = int((l+r)/2)
            if target == nums[mid]:
                return mid
            if nums[mid] < nums[r]:
                if target > nums[mid] and target <= nums[r]:
                    l = mid+1
                else:
                    r = mid-1
            else:
                if target < nums[mid] and target >= nums[l]:
                    r = mid-1
                else:
                    l = mid+1
        return -1

日期: 2021-04-10 

原文地址:https://www.cnblogs.com/wangyuxia/p/14641750.html