题目链接
题目描述
题解
题解一(Java)
作者:@仲景
其实这个题就是一个判断中点落在哪里的问题
在二分查找的过程中,假设mid落在这个数组的任意一点,那么必有left-mid
有序或者mid-right
有序
我们只需要判断在有序的集合里能不能找到这个target
值就可以了
如果在当前有序的那部分找不到的话,说明有序的这部分是可以舍去的
那是把可能无序的那部分继续当做一个整体,对他继续进行前面的逻辑就可以了
如果二分结束还找不到就返回-1
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid;
}
if (nums[mid] >= nums[left]) {
// 如果mid左边有序
if (target >= nums[left] && target < nums[mid]) {
// target一定落在左边的有序集合内
right = mid - 1;
} else {
// target不在mid左边,去右边找
left = mid + 1;
}
} else {
// mid右边有序
if (target > nums[mid] && target <= nums[right]) {
// target一定在mid右边
left = mid + 1;
} else {
// target不在mid右边,去左边找
right = mid - 1;
}
}
}
return -1;
}
}