81. Search in Rotated Sorted Array II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public boolean search(int[] nums, int target) {
// 注意可能存在重复值
int left = 0, right = nums.length - 1; // [left, right]
while (left <= right) {
int mid = (left + right) >>> 1;
if (nums[mid] == target) {
return true;
}

if (nums[mid] < nums[right]) {
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else if (nums[mid] > nums[right]) {
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
right--;
}
}

return false;
}
}

该题关键之处在于处理重复元素,如 [1, 0, 1, 1, 1] 这样的数组时,首次 nums[mid] 将定位至 nums[2] = 1,此时不能判断向左侧收缩还是向右侧收缩,所以我们通过跳过重复元素来解决该问题。

References

81. Search in Rotated Sorted Array II