Using the find minimum discussed in Leetcode 153. Find Minimum in Rotated Sorted Array.
After found the minimum, apply binary search on the sorted array.
public class Solution {
// find the index of the minimum
public int searchMin (int[] nums) {
int low = 0, high = nums.length-1, mid = 0;
while (low < high) {
mid = (low+high)/2;
if (nums[mid] > nums[high]) low = mid + 1;
else high = mid;
}
return low;
}
// binary search for sorted array
public int binarySearch (int[] nums, int low, int high, int target) {
int mid = 0;
while (low < high) {
mid = (low+high)/2;
if (nums[mid] < target) low = mid+1;
else high = mid;
}
return (nums[low] == target) ? low : -1;
}
public int search(int[] nums, int target) {
if (nums.length == 0) return -1;
int imin = 0; // index of the minimum value
int start = 0, end = nums.length-1, mid = 0;
imin = searchMin(nums);
if (target <= nums[nums.length-1]) return binarySearch(nums, imin, nums.length-1, target);
return binarySearch(nums, 0, imin-1, target);
}
}