Poison

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
31
32
class Solution {
public boolean search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + right) >>> 1;
if (nums[mid] == target) {
return true;
}

if (nums[left] == nums[mid]) {
left++;
continue;
}

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

return false;
}
}
Binary Search
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
31
32
33
34
35
36
37
38
39
class Solution {
public boolean search(int[] nums, int target) {
// 与 33 题区别:该题有重复元素

int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + right) >>> 1;
if (nums[mid] == target) {
return true;
}

if (nums[mid] > nums[left]) {
// 左侧数组递增
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else if (nums[mid] < nums[right]) {
// 右侧数组递增
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else {
// 左侧端点或右侧端点存在与 nums[mid] 相同的元素,需要跳过这些元素
while (left <= right && nums[left] == nums[mid]) {
left++;
}
while (left <= right && nums[mid] == nums[right]) {
right--;
}
}
}

return false;
}
}

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

Reference

81. Search in Rotated Sorted Array II