Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).

You are given a target value to search. If found in the array return true, otherwise return false.

Example 1:

Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true
Example 2:

Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false
Follow up:

This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.
Would this affect the run-time complexity? How and why?


 

class Solution {
    public boolean search(int[] nums, int target) {
        // sanity check 
        if(nums == null || nums.length == 0) return false;
        int left = 0;
        int right = nums.length - 1; 
        while(left <= right){ //  <=
            int mid = left + (right - left) / 2;
            if(nums[mid] == target) return true;
            // right half is sorted
            if(nums[mid] < nums[right]){
                // if target is in between 
                if(target > nums[mid] && target <= nums[right]){ //  <=
                    left = mid + 1;
                }else{
                   // else
                    right = mid - 1;
                }
            }else if(nums[mid] > nums[right]){
                // left half is sorted
                if(target >= nums[left] && target < nums[mid]){ // >=
                    // target is in between 
                    right = mid - 1;
                }else{
                    left = mid + 1;
                }
            }else{
                // nums[mid] == nums[right]
                right = right - 1;
            }
        }
        return false;
    }
}