我们知道,对于有序数组,可以使用二分查找
而这个经过旋转排序的,前后是部分有序的,
我们可以先判断首个元素和target的关系
来确定target是在数组的前后哪个部分
class Solution {
public int search(int[] nums, int target) {
int st = 0;
int ed = nums.length - 1;
if (target >= nums[0]) {
while(st<=ed) {
int mid = (st + ed) / 2;
if(nums[mid] == target) {
return mid;
}
if(nums[mid] < nums[0] || target < nums[mid]) {
ed = mid - 1;
} else {
st = mid + 1;
}
}
} else {
while(st<=ed) {
int mid = (st + ed) / 2;
if(nums[mid] == target) {
return mid;
}
if(nums[mid] >= nums[0] || target > nums[mid]) {
st = mid + 1;
} else {
ed = mid - 1;
}
}
}
return -1;
}
}
2021/8/21 重写
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
int ans = 0;
// 二分找出转折点
int flag = len;
int l = 1;
int r = len - 1;
int mid = 0;
while (l <= r) {
mid = (l + r) >> 1;
if (nums[mid] < nums[mid - 1]) {
flag = mid;
break;
} else if (nums[mid] > nums[0]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
// 二分找出值
if (target >= nums[0]) {
ans = Arrays.binarySearch(nums, 0, flag, target);
} else {
ans = Arrays.binarySearch(nums, flag, len, target);
}
return ans >= 0 ? ans : -1;
}
}