天天看點

Binary Search:81. Search in Rotated Sorted Array II

Binary Search:81. Search in Rotated Sorted Array II

這道題與之前Search in Rotated Sorted Array類似,問題隻在于存在dupilcate。那麼和之前那道題的解法差別就是,不能通過比較A[mid]和邊緣值來确定哪邊是有序的,會出現A[mid]與邊緣值相等的狀态。是以,解決方法就是對于A[mid]==A[low]和A[mid]==A[high]單獨處理。

     當中間值與邊緣值相等時,讓指向邊緣值的指針分别往前移動,忽略掉這個相同點,再用之前的方法判斷即可。

     這一改變增加了時間複雜度,試想一個數組有同一數字組成{1,1,1,1,1},target=2, 那麼這個算法就會将整個數組周遊,時間複雜度由O(logn)升到O(n)

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int n = nums.size();
        if (n == 0) return false;
        int left = 0, right = n - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) return true;
            else if (nums[mid] < nums[right]) {
                if (nums[mid] < target && nums[right] >= target) left = mid + 1;
                else right = mid - 1;
            } else if (nums[mid] > nums[right]){
                if (nums[left] <= target && nums[mid] > target) right = mid - 1;
                else left = mid + 1;
            } else --right;
        }
        return false;
    }
};