Solution 1
这个题是之前Search in Rotated Sorted Array的变体,主要是加入了序列中可能存在邻近相同的情形。对应地出现的情况是,如果出现了middle项和right项相等的情况,无法判断middle项在左右哪一个子序列中,进而无法进一步确定搜索空间。这部分我看了题解,没想到就是简单的缩小一下区间就成了……因此实现过程基于Search in Rotated Sorted Array,额外增加对
- 时间复杂度: O ( log n ) O(\log n) O(logn),其中 n n n为输入序列的长度,二分查找
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态变量
class Solution {
public:
bool search(vector<int>& nums, int target) {
int length = nums.size();
if (length == 0) {
return false;
}
int left = 0, right = length - 1;
while (left <= right) {
int middle = left + (right - left) / 2;
if (nums[middle] == target) { return true; }
if (nums[middle] == nums[right]) {
// 没办法确定区间了,缩一下看看
right--;
} else if (nums[middle] < nums[right]) {
// 右侧有序
if (nums[middle] < target && target <= nums[right]) {
left = middle + 1;
} else {
right = middle;
}
} else {
// 左侧有序
if (nums[left] <= target && target < nums[middle]) {
right = middle;
} else {
left = middle + 1;
}
}
}
return false;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def search(self, nums: List[int], target: int) -> bool:
if len(nums) == 0: return False
left, right = 0, len(nums) - 1
while left <= right:
middle = left + (right - left) // 2
if nums[middle] == target: return True
if nums[middle] == nums[right]: right -= 1
elif nums[middle] < nums[right]:
if nums[middle] < target and target <= nums[right]: left = middle + 1
else: right = middle
else:
if nums[left] <= target and target < nums[middle]: right = middle
else: left = middle + 1
return False