0%

81. Search in Rotated Sorted Array II

binary search O(logn) on avg
O(n) worst case [1, 1, …, 1, 0, 1, 1, …, 1] search 0

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
class Solution {
public:
bool search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0, r = n - 1;
while (l <= r) {
int m = l + (r - l) / 2;
if (nums[m] == target) return true;
if (nums[l] < nums[m]) {
if (nums[l] <= target && target < nums[m]) {
r = m - 1;
} else {
l = m + 1;
}
} else if (nums[l] > nums[m]) {
if (nums[m] < target && target <= nums[r]) {
l = m + 1;
} else {
r = m - 1;
}
} else {
++l; // 因为nums[m]不是target而nums[m] == nums[l],所以++l来缩小搜索范围
}
}
return false;
}
};

worst case [0, 1, 1, 1, …, 1, 1]

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
class Solution {
public:
bool search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0, r = n - 1;
while (l <= r) {
int m = l + (r - l) / 2;
if (nums[m] == target) return true;
if (nums[m] > nums[r]) {
if (nums[l] <= target && target < nums[m]) {
r = m - 1;
} else {
l = m + 1;
}
} else if (nums[m] < nums[r]) {
if (nums[m] < target && target <= nums[r]) {
l = m + 1;
} else {
r = m - 1;
}
} else {
--r;
}
}
return false;
}
};