力扣-81. 搜尋旋轉排序陣列 II

DawnTraveler發表於2024-07-14

1.題目

題目地址(81. 搜尋旋轉排序陣列 II - 力扣(LeetCode))

https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/

題目描述

已知存在一個按非降序排列的整數陣列 nums ,陣列中的值不必互不相同。

在傳遞給函式之前,nums 在預先未知的某個下標 k0 <= k < nums.length)上進行了 旋轉 ,使陣列變為 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標 從 0 開始 計數)。例如, [0,1,2,4,4,4,5,6,6,7] 在下標 5 處經旋轉後可能變為 [4,5,6,6,7,0,1,2,4,4]

給你 旋轉後 的陣列 nums 和一個整數 target ,請你編寫一個函式來判斷給定的目標值是否存在於陣列中。如果 nums 中存在這個目標值 target ,則返回 true ,否則返回 false

你必須儘可能減少整個操作步驟。

示例 1:

輸入:nums = [2,5,6,0,0,1,2], target = 0
輸出:true

示例 2:

輸入:nums = [2,5,6,0,0,1,2], target = 3
輸出:false

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • 題目資料保證 nums 在預先未知的某個下標上進行了旋轉
  • -104 <= target <= 104

進階:

  • 此題與 搜尋旋轉排序陣列 相似,但本題中的 nums 可能包含 重複 元素。這會影響到程式的時間複雜度嗎?會有怎樣的影響,為什麼?

2.題解

2.1 二分法

思路

對比33. 搜尋旋轉排序陣列
這題需要考慮重複元素,尤其是nums[left] == nums[mid] == nums[right]時我們無法判斷哪個時有序區間!!!
例如 nums=[3,1,2,3,3,3,3],target=2,首次二分時無法判斷區間 [0,3] 和區間 [4,6] 哪個是有序的。

處理方法也很簡單,我們由前面判斷target != nums[mid] == nums[left] == nums[right]
所以排除兩個位置left和right(將left++, right--)

程式碼

  • 語言支援:C++

C++ Code:


class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1;
        while(left <= right){
            int mid = (right - left) / 2 + left;
            if(target == nums[mid]) return true;
            // 此時已經確定target != nums[left] == nums[left] == nums[right],可直接排除兩個邊緣繼續尋找
            if(nums[mid] == nums[left] && nums[mid] == nums[right]){
                left++; right--;
            }
            else if(nums[left] <= nums[mid]){
                if(target < nums[mid] && target >= nums[left]){
                    right = mid - 1;
                }else{
                    left = mid + 1;
                }
            }else{
                if(target <= nums[right] && target > nums[mid]){
                    left = mid + 1;
                }else{
                    right = mid - 1;
                }
            }
        }
        return false;
    }
};

複雜度分析

令 n 為陣列長度。

  • 時間複雜度:\(O(n)\)
  • 空間複雜度:\(O(n)\)

相關文章