思路
以mid为分界线,左右两边必有一侧为递增的。
根据begin,mid,end的大小规律,每次搜寻的时候避开乱序部分。
附上YouTube讲解https://www.youtube.com/watch?v=KSZfO65J6hg
复杂度
时间复杂度O(log n),空间复杂度O(1)
代码
参考九章的二分模板
class Solution {
public int search(int[] nums, int target) {
if(nums.length == 0)
return -1;
int start = 0, end = nums.length-1;
while(start + 1 < end) {
int mid = start + (end-start)/2;
if(nums[mid] == target)
return mid;
if(nums[mid] > nums[start]) {
if(nums[start] <= target && target <= nums[mid]) {
end = mid;
} else {
start = mid;
}
} else {
if(nums[mid] <= target && target <= nums[end]) {
start = mid;
} else {
end = mid;
}
}
}
if(nums[start] == target) {
return start;
} else if(nums[end] == target) {
return end;
}
return -1;
}
}