// main
public int search(int[] nums, int target) {
int n = nums.length;
if (n == 0) {
return -1;
}
if (n == 1) {
return nums[0] == target ? 0 : -1;
}
int rotateIndex = findRotateIndex(nums, 0, n - 1);
if (nums[rotateIndex] == target) {
return rotateIndex;
}
if (rotateIndex == 0) {
return search(nums, 0, n - 1, target);
}
if (target < nums[0]) {
return search(nums, rotateIndex + 1, n - 1, target);
} else {
return search(nums, 0, rotateIndex - 1, target);
}
}
private int search(int[] nums, int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
private int findRotateIndex(int[] nums, int left, int right) {
if (nums[left] < nums[right]) {
return left;
}
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[mid + 1]) {
return mid + 1;
} else {
if (nums[mid] < nums[left]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
}
return 0;
}
网友评论