这道题的思想就是二分,但是因为不是传统的有序数组,但是也是可以进行二分的。因为对于这一段序列,他其实也是两段有序的序列合并的,所以如果每次选取一个mid之后,总会且分出一段是有序的,而另一段是无序的或者有序,所以总会有一段是确定有序的,所以我们的着手点就是那段有序的序列,所以我们可以进行二分,二分代码:
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
int left = 0;
int right = len-1;
// 特判
if(len == 0){
return -1;
}
if(len == 1){
if(nums[0]==target){
return 0;
}else{
return -1;
}
}
// 开始进行二分
int index = -1;
while(left<=right){
int mid = (left+right) / 2;
if(nums[mid] == target){
index = mid;
break;
}else if(nums[mid]>=nums[left]){ // 判断实在左半段还是在右半段
// 相当于每一次都会将数组切分为一段是有序的,另一段是无序的,所以,直接判断有序的即可
// 在左半段
if(target>=nums[left] && target<nums[mid]){
// 左半段的前面
right = mid-1;
}else{
left = mid+1;
}
}else{
// 在右半段
if(target>nums[mid] && target<=nums[right]){
// 在右半段的后面
left = mid+1;
}else{
right = mid-1;
}
}
}
return index;
}
}
愿世界和平!