题目规定要logn时间复杂度 明显就是二分法,我们只要对二分法稍微加点判断就ok了
public static int search(int[] nums, int target) {
int start = 0, end = nums.length - 1;
int result = -1;
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] == target) {
result = mid;
break;
} else if (nums[mid] > target) {
//因为排好序的数组被旋转了,我们需要判断一下可能的俩种情况
//5 6 7 8 9 1 2 一种是从中间往前是有序的
if(nums[mid]>nums[end]){
//如果是中间往前是有序的我们要判断下 第一个数是不是比目标大
//是的话 说明目标在后面
//否则的话 目标在前面
if(nums[start]<=target){
end=mid-1;
}else{
start=mid+1;
}
}
//8 1 2 3 4 5 6 一种是从中间往后是有序的
//这种后面都比mid大 所以就不用判断了
//下面同理
else{
end=mid-1;
}
} else {
if(nums[mid]>nums[end]){
start=mid+1;
}else{
if(nums[end]>=target){
start=mid+1;
}else{
end=mid-1;
}
}
}
}
return result;
}