思路
以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;}
}