Question

Formatted question description: https://leetcode.ca/all/81.html

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 for "Search in Rotated Sorted Array":
    What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

@tag-array

Algorithm

Since the previous question Search in Rotated Sorted Array does not have the same value, when we compare the middle value and the rightmost value, we are in full compliance with the previous rule:

  • if the number in the middle is less than the rightmost number, the right half is in order.
  • If the number is greater than the rightmost number, the left half is ordered.

And if there can be repeated values, there will be two situations, [3 1 1] and [1 1 3 1]. For these two situations, when the intermediate value is equal to the rightmost value, the target value 3 can be either on the left or on the right.

It can be on the right, then what should we do? In this case, it is actually very simple. Just move the rightmost value to the left to continue the loop. If it is still the same, continue to move until it reaches a different value, and then the other parts are still Use the method in Search in Rotated Sorted Array

Code

Java

public class Search_in_Rotated_Sorted_Array_II {

    // time: O(1)
    // space: O(N)
	public class Solution {
	    public boolean search(int[] nums, int target) {

	        if (nums == null || nums.length == 0) {
	            return false;
	        }

	        int i = 0; // left pointer
	        int j = nums.length - 1; // right pointer

	        while(i <= j) {
	            int mid = (i + j) / 2;

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

	            // @note: if (nums[0] <= nums[mid]) {
	            if (nums[i] <= nums[mid]) { // left half ordered, right half not ordered

	                // if (target <= nums[mid]) {
	                if (nums[i] <= target && target <= nums[mid]) {
	                    j = mid;
	                } else {
	                    i++;
	                }
	            } else { // right half ordered, left half not ordered

	                // if (target <= nums[mid]) {
	                if (nums[mid] <= target && target <= nums[j]) {
	                    i = mid;
	                } else {
	                    j--;
	                }
	            }
	        }

	        return false;
	    }

	}
}

All Problems

All Solutions