思路
与33的区别在于,有重复值的话,在利用nums[mid]和nums[left]判断哪边升序的时候,如果两者相等,则无法判断哪边有序。
如:3,1,2,3,3,3,3 这种情况下必须直接遍历,即left++
时间复杂度
如nums为[1,1,1,1,1,1,1,1,1,1,0],lo++ 导致时间复杂度为 O(n),为最坏情况的时间复杂度。
class Solution {
public boolean search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return true;
} else if (nums[mid] > nums[left]) {//前边部分有序
if (target >= nums[left] && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else if (nums[mid] < nums[left]) {//后半部分有序
if (target <= nums[right] && target > nums[mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else if (nums[mid] == nums[left]) {//无法判断哪边有序
left++;//可以直接除去left,如果left=mid,第一个if已经判断过是否等于target
}
}
return false;
}
}