Search in Rotated Sorted Array
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.
1. 0 1 2 4 5 6 7
2. 7 0 1 2 4 5 6
3. 6 7 0 1 2 4 5
4. 5 6 7 0 1 2 4
5. 4 5 6 7 0 1 2
6. 2 4 5 6 7 0 1
7. 1 2 4 5 6 7 0
We can use binary search method to solve this problem. Firstly, let's try to find the regular pattern from the rotated array list above. From list 2,3,4, we can see that the value of the middle element is less that the value of the first element and the right half of every list is in an ascending order. From list 1,5,6,7, we can see that the value of the middle element is larger than the value of the first element and the left half of the list is in an ascending order.
public class Solution {
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0)
return -1;
int start = 0;
int end = nums.length - 1;
while (start < end) {
int mid = start + (end - start) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < nums[start]) {
if (target <= nums[end] && target > nums[mid])
start = mid + 1;
else
end = mid - 1;
}
else {
if (target >= nums[start] && target < nums[mid])
end = mid - 1;
else
start = mid + 1;
}
}
if (target == nums[start])
return start;
else
return -1;
}
}