LeetCode 33. 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,7] might become [4,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.

Your algorithm’s runtime complexity must be in the order of O(log n).

Example 1:

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

Example 2:

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

思路

二分查找。
不过此题是Rotated Sorted Array,所以不能通过mid与左右指针指向的值的比较来移动指针。而是通过判断哪一部分是有序的,target是否在这个有序的部分来实现。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if not nums:
return -1
left, right = 0, len(nums)-1
while left <= right:
m = (left+right)/2
if target == nums[m]:
return m
elif nums[m] < nums[right]:
if target > nums[m] and target <= nums[right]:
left = m + 1
else:
right = m - 1
else:
if target >= nums[left] and target < nums[m]:
right = m - 1
else:
left = m + 1
return -1