Search in Rotated Sorted Array - Leetcode 33

Search in Rotated Sorted Array - Leetcode 33

ยท

3 min read

Problem - Leetcode

There is an integer array nums sorted in ascending order (with distinct values).

Prior to being passed to your function, nums is possibly rotated at an unknown pivot index k (1 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,5,6,7] might be rotated at pivot index 3 and become [4,5,6,7,0,1,2].

Given the array nums after the possible rotation and an integer target, return the index of target if it is in nums, or -1 if it is not in nums.

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

Example 3:

Input: nums = [1], target = 0
Output: -1

Constraints:

  • 1 <= nums.length <= 5000

  • -10<sup>4</sup> <= nums[i] <= 10<sup>4</sup>

    All values of nums are unique.

  • nums is an ascending array that is possibly rotated.

  • -10<sup>4</sup> <= target <= 10<sup>4</sup>

Solution in Golang

func search(nums []int, target int) int {
    left, right := 0, len(nums) - 1

    for left <= right {
        mid := (left + right) / 2
        if target == nums[mid] {
            return mid
        }

        // left sorted portion
        if nums[left] <= nums[mid] {
            if target > nums[mid] || target < nums[left] {
                left = mid + 1
            } else {
                right = mid - 1
            }
        // Right sorted portion
        } else {
            if target < nums[mid] || target > nums[right] {
                right = mid - 1
            } else {
                left = mid + 1
            }
        }
    }
    return -1
}

This is an implementation of a binary search algorithm to find the index of a target element in a rotated sorted array. The function takes two parameters: a sorted array nums and a target element target. It initializes two pointers, left and right, which represent the range of indices to search within.

The algorithm then enters a while loop, where it calculates the middle index mid of the current range. If the target is equal to the element at the middle index, it returns the index.

The interesting part comes when dealing with the rotated sorted array. It checks whether the left portion or the right portion of the array is sorted. If the left portion is sorted, it checks whether the target lies within that sorted range. If it does, the search continues in the left portion; otherwise, it shifts the search to the right portion. Similarly, if the right portion is sorted, it checks whether the target lies within that range and adjusts the search accordingly.

This approach allows the algorithm to handle rotated sorted arrays efficiently, maintaining the logarithmic time complexity of the standard binary search.

Did you find this article valuable?

Support Jyotirmoy Barman by becoming a sponsor. Any amount is appreciated!