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是否包含在其中,如果包含则缩小搜索范围继续二分查找,若不包含,则在左边照上述方式重复比较。如果左边完全有序则同理查找。
public int search(int[] nums, int target) {
int start=0,end=nums.length-1;
while(start<=end)
{
int mid=(start+end)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]<nums[end])
{
if(nums[mid]<target&&nums[end]>=target)
start=mid+1;
else
end=mid-1;
}
else{
if(nums[mid]>target&&nums[start]<=target)
end=mid-1;
else
start=mid+1;
}
}
return -1;
}
Runtime: 5 ms, faster than 100.00% of Java online submissions for Search in Rotated Sorted Array.
Memory Usage: 40.1 MB, less than 10.91% of Java online submissions for Search in Rotated Sorted Array.