Search in Rotated Sorted Array — Half-Sorted Check

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem 310 · Search in Rotated Sorted Array

Difficulty: Medium · Pattern: Rotated Array BS

Intuition

One of the two halves is always sorted. Check which half, then determine if target falls in the sorted half.

Solutions

# Python
def search(nums, target):
    lo, hi = 0, len(nums)-1
    while lo <= hi:
        mid = (lo+hi)//2
        if nums[mid] == target: return mid
        if nums[lo] <= nums[mid]:  # left half sorted
            if nums[lo] <= target < nums[mid]: hi = mid-1
            else: lo = mid+1
        else:  # right half sorted
            if nums[mid] < target <= nums[hi]: lo = mid+1
            else: hi = mid-1
    return -1
// Java
public int search(int[] nums, int target) {
    int lo=0, hi=nums.length-1;
    while (lo<=hi) {
        int mid=lo+(hi-lo)/2;
        if (nums[mid]==target) return mid;
        if (nums[lo]<=nums[mid]) {
            if (nums[lo]<=target&&target<nums[mid]) hi=mid-1; else lo=mid+1;
        } else {
            if (nums[mid]<target&&target<=nums[hi]) lo=mid+1; else hi=mid-1;
        }
    }
    return -1;
}
// C++
int search(vector<int>& nums, int target) {
    int lo=0, hi=nums.size()-1;
    while (lo<=hi) {
        int mid=lo+(hi-lo)/2;
        if (nums[mid]==target) return mid;
        if (nums[lo]<=nums[mid]) {
            if (nums[lo]<=target&&target<nums[mid]) hi=mid-1; else lo=mid+1;
        } else {
            if (nums[mid]<target&&target<=nums[hi]) lo=mid+1; else hi=mid-1;
        }
    }
    return -1;
}

Complexity

  • Time: O(log n)
  • Space: O(1)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro