題目網址:https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/

題意:存在一整數 array nums, 按非降序排列, nums 中的數值有可能會重複。

給一旋轉後nums 和一整數 target, 如果 nums 中存在 target, 則返回其 true; 否則, 返回 false

盡可能地減少操作步驟。

Solution:

想法:類似 33. Search in Rotated Sorted Array, 差別在本題的 nums 可能會有重複數, 導致 nums[left] == nums[mid] 時, 無法判斷 [left, mid][mid + 1, right] 哪個才是有序的

e.g. nums = [1,1,1,0,1], target = 0
無法判斷 [0,2][3,4] 哪個才是有序的。

對於這種情況, 將 left + 1, 然後在新區間繼續做 Binary Search

class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;

while (left <= right) {
const int mid = left + (right - left) / 2;

if (nums[mid] == target) {
return true;
}

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

return false;
}
};
  • time:$O(n)$ ➔ worse case:元素均相等, 且不為 target, 則需拜訪所有位置才能得出結果
  • space:$O(1)$ ➔ 只需常數空間