一、题目
力扣原题:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/
搜索旋转排序数组(不含重复元素):https://blog.youkuaiyun.com/sinat_34596644/article/details/106118330
二、二分查找
class Solution {
public boolean search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return true;
}
// 分不清左边/右边有序
if (nums[mid] == nums[left]) {
left++;
continue;
}
// 左边有序
else if (nums[mid] > nums[0]) {
if (target >= nums[0] && target < nums[mid]) {
right = mid - 1;
} else {
left = left + 1;
}
}
// 右边有序
else {
if (target <= nums[nums.length - 1] && target > nums[mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return false;
}
}
- 时间复杂度:O(log(n))。极端情况下(数值全部相等)可退化为O(n)。
- 空间复杂度:O(1)
三、总结
- 区别不含重复元素的旋转排序数组,当nums[mid]与nums[left]相等时,无法区别左边/右边有序,此时只能尝试移动left指针。