Search in Rotated Sorted Array

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,0 1 2 4 5 6 7might become4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

这道题让在旋转数组中搜索一个给定值,若存在返回坐标,若不存在返回-1。我们还是考虑二分搜索法,但是这道题的难点在于我们不知道原数组在哪旋转了,我们还是用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法:

0 1 2 4 5 6 7

7 0 1 2 4 5 6

6 7 0 1 2 4 5

5 6 7 0 1 2 4

4 5 6 7 0 1 2

2 4 5 6 7 0 1

1 2 4 5 6 7 0

二分搜索法的关键在于获得了中间数后,判断下面要搜索左半段还是右半段,我们观察上面黑体的数字都是升序的,由此我们可以观察出规律,通过查找区间的尾部元素小于首部元素来验证区间不是全部有序的。例如如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,然后我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了。

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if len(nums)==0:
            return -1
        start, end = 0, len(nums)-1
        while start+1<end:
            mid = (start+end)/2
            #left part of the list are sorted
            if nums[mid] > nums[end]:
                if target > nums[mid] or target < nums[start]:
                    start = mid
                else:
                    end = mid
            #right parts are sorted
            else:
                if target < nums[mid] or target > nums[end]:
                    end = mid
                else:
                    start = mid
        if nums[start] == target:
            return start
        elif nums[end] == target:
            return end
        return -1

Last updated

Was this helpful?