0%

33. Search in Rotated Sorted Array

binary search O(logn)
先判断左半边数多还是右半边数多,再对每一种情况分类讨论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def search(self, nums: List[int], target: int) -> int:
l, r = 0, len(nums) - 1
while (l <= r):
m = l + (r - l) // 2
if nums[m] == target:
return m
elif nums[m] > nums[r]:
if nums[l] <= target < nums[m]:
r = m - 1
else:
l = m + 1
else:
if nums[m] < target <= nums[r]:
l = m + 1
else:
r = m - 1
return -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
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0, r = n - 1;
while (l <= r) { // 这道题是要找数,所以要=
int mid = (l + r) / 2;
if (target == nums[mid]) { // 找到直接返回
return mid;
} else if (nums[mid] > nums[r]) {
if (nums[l] <= target && target < nums[mid]) { // 检查是否在单调区间
r = mid - 1;
} else {
l = mid + 1;
}
} else {
if (nums[mid] < target && target <= nums[r]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
}
return -1;
}
};