题目:
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.
解决方法一: Runtime: 15 ms 二分查找的思想public class Solution {
public int search(int[] nums, int target) {
return searchTarget(nums,0,nums.length-1,target);
}
private int searchTarget(int[] nums, int start, int end, int target){
if(start>end) return -1;
int mid =(start+end)/2;
if(target==nums[mid]) return mid;
if(mid+1<=end&&nums[mid]>nums[mid+1])
if(target<=nums[end])
return searchTarget(nums,mid+1,end,target);
else
return searchTarget(nums,start,mid-1,target);
else if(mid-1>=start&&nums[mid]<nums[mid-1])
if(target<=nums[end])
return searchTarget(nums,mid+1,end,target);
else
return searchTarget(nums,start,mid-1,target);
else{
int left = searchTarget(nums,start,mid-1,target);
int right= searchTarget(nums,mid+1,end,target);
int ret = -1;
ret= left==-1? ret:left;
ret = right==-1?ret:right;
return ret;
}
}
}
解决方法二: 优化后 Runtime: 13 ms
public class Solution {
public int search(int[] nums, int target) {
int mid =0;
int start =0;
int end = nums.length-1;
int ret = -1;
while(start<=end){
mid =(start+end)/2;
if(target==nums[mid]){
ret = mid;
break;
}
if(nums[mid]>nums[end]){
end = target>=nums[start]&&target<nums[mid]? mid-1:end;
start = target>=nums[start]&&target<nums[mid]?start:mid+1;
}
else if(nums[mid]<nums[start]){
start = target<=nums[end]&&target>nums[mid]? mid+1:start;
end = target<=nums[end]&&target>nums[mid]?end:mid-1;
} else{
start = target<=nums[mid]? start:mid+1;
end = target<=nums[mid]? mid-1:end;
}
}
return ret;
}
}
参考: