Description

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:

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

分析

题目的意思是:在旋转的有序数组里面找出给定的target值的位置。

  • 要求时间复杂度必须是O(logn),一看就是二分搜索。

代码

class Solution {
public:
int search(vector<int>& nums, int target) {
int low=0;
int high=nums.size()-1;
while(low<=high){
int mid=(low+high)/2;
if(nums[mid]==target){
return mid;
}else if(target>nums[mid]){
if(target<=nums[high]||nums[low]<nums[mid]){
low=mid+1;
}else{
high=mid-1;
}
}else{
if(target>=nums[low]||nums[mid]<nums[high]){
high=mid-1;
}else{
low=mid+1;
}
}
}
return -1;
}
};

代码二 (python)

由于是旋转数组,所以二分查找更新边界的时候多了限制。如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数来判断目标值是否在这一区域内。

class Solution:
def search(self, nums: List[int], target: int) -> int:
l=0
h=len(nums)-1
while(l<=h):
mid=l+(h-l)//2
if(nums[mid]==target):
return mid
elif(nums[mid]<target):
if(target<=nums[h] or nums[l]<nums[mid]):
l=mid+1
else:
h=mid-1
else:
if(target>=nums[l] or nums[mid]<nums[h]):
h=mid-1
else:
l=mid+1
return -1

参考文献

​[LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索​