Suppose a sorted array 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.
在一个经过旋转之后的有序数组中,找到给定值的索引.这个数组没有重复值.
用二分搜索找到数组最小值的索引.比较nums[mid] 和 nums[left].
如果nums[mid] 大于 nums[left] ,left 到 mid 肯定是升序的,最小值在 nums[left] 和 nums[mid + 1, .. , right] 之中.
如果nums[mid] 小于 nums[left] ,最小值在 nums[left, .. , mid] 之中.
找到数组最小值的索引后,判断target在哪个区间,再用二分搜索.
public class A33SearchinRotatedSortedArray {
public int findMinIndex(int[] nums, int left, int right) {
if(left > right) {
return -1;
}
int mid = left + (right - left) / 2;
if(nums[mid] >= nums[left]) {
int make = findMinIndex(nums, mid + 1, right);
if(make == -1)
return left;
else
return nums[make] < nums[left] ? make : left;
} else {
int make = findMinIndex(nums, left, mid - 1);
if(make == -1)
return mid;
else
return nums[make] < nums[mid] ? make : mid;
}
}
public int binarySearch(int[] nums, int left, int right, int target) {
if(left > right)
return -1;
int mid = left + (right - left) / 2;
if(nums[mid] < target) {
return binarySearch(nums, mid + 1, right, target);
} else if(nums[mid] > target) {
return binarySearch(nums, left, mid - 1, target);
} else {
return mid;
}
}
public int search(int[] nums, int target) {
int min = findMinIndex(nums, 0, nums.length - 1);
if(target > nums[nums.length - 1]) {
return binarySearch(nums, 0, min - 1, target);
} else {
return binarySearch(nums, min, nums.length - 1, target);
}
}
}