Skip to main content

Leetcode 33: Search in Rotated Sorted Array


1. Problem Statement (Simple Explanation):


You’re given:

  • An array nums, originally sorted in ascending order with distinct values.

  • It has been rotated at some unknown index k (0 ≤ k < n).

  • An integer target.

The rotated array looks like:

  • [nums[k], nums[k+1], ..., nums[n-1], nums[0], ..., nums[k-1]]

You must:

  • Return the index of target in nums if it exists.

  • Otherwise, return -1.

You must achieve O(log n) time → so you need a variant of binary search.


2. Examples:


Example 1:

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

0 is at index 4.

Output: 4


Example 2:

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

3 is not in the array.

Output: -1


Example 3:

Input: nums = [1], target = 0

0 is not in the array.

Output: -1


Constraints:

  • 1 <= nums.length <= 5000

  • -104 <= nums[i] <= 104

  • All nums[i] are unique.

  • nums is sorted ascending then possibly rotated.

  • -104 <= target <= 104


3. Approach – Modified Binary Search (O(log n)):


We use binary search, but account for the rotation.


Key Observation:


Even though the array is rotated, at any mid point, at least one half is still properly sorted:

  • Check nums[left] and nums[mid]:

    • If nums[left] <= nums[mid] → the left half [left..mid] is sorted.

    • Else → the right half [mid..right] is sorted.

Once we know which half is sorted, we can decide whether target lies in that half or in the other half.


Algorithm (Step-by-Step):


  1. Initialize:

    • left = 0

    • right = n - 1

  2. While left <= right:

    • Compute mid = left + (right - left) / 2.

    • If nums[mid] == target, return mid.

    • Determine which half is sorted:


Case 1 – Left half sorted:

if nums[left] <= nums[mid]:

Then:

Check if target is within this sorted left half:

if nums[left] <= target < nums[mid]:

    right = mid - 1

else:

    left = mid + 1


Case 2 – Right half sorted:

else:

then right half [mid..right] is sorted:

Check if target is within that sorted right half:

if nums[mid] < target <= nums[right]:

    left = mid + 1

else:

    right = mid - 1


  1. If the loop ends without finding target, return -1.

This works because we always discard half of the search space, ensuring O(logn) time.


Pseudo-code:



Complexity:


Let n = len(nums):

  • Time: O(logn)

  • Space: O(1)

Meets the requirement.


4. Java code:



5. C code:



6. C++ code:



7.  Python code:



8. JavaScript code:


Comments

Popular posts from this blog

Leetcode 1: Two Sum

  Leetcode Link: https://leetcode.com/problems/two-sum/ 1. Problem Statement (Simple Explanation) You are given: An array of integers nums An integer target You need to  return the indices of two numbers in the array  such that: Conditions: Each input has  exactly one solution . You  cannot use the same element twice . You can return the answer in  any order . 2. Examples Example 1 Input:                                    nums = [2, 7, 11, 15], target = 9 Output:                                 [0, 1] Explanation:                     nums[0]+nums[1]=2+7=9              So we return [0, 1]. Example 2 Input:           ...

Leetcode 3: Longest Substring Without Repeating Characters

  Leetcode Link 1. Problem Statement (Simple Explanation) You are given a string s. You need to find the length of the longest substring of s that does not  contain any repeated characters. A substring is a contiguous sequence of characters in the string. You must return an integer length, not the substring itself. 2. Examples Example 1 Input: s = "abcabcbb" Output: 3 Explanation: Some substrings without repeating characters: "abc", "bca", "cab"The longest length is 3. Example 2 Input: s = "bbbbb" Output: 1 Explanation: All substrings that are valid are just "b". The longest length is 1. Example 3 Input:   s = "pwwkew" Output:   3 Explanation: Possible substrings without repetition: "pw", "wke", "kew". "wke" or "kew" have length 3. "pwke" is not valid because it’s not contiguous in the original string (p and k are separated by ww). Constraints...

Leetcode 2: Add Two Numbers

Leetcode Link: https://leetcode.com/problems/add-two-numbers/ 1. Problem Statement (Simple Explanation) You are given  two non-empty linked lists , l1 and l2, that represent two non-negative integers. Each node contains a  single digit . The digits are stored in  reverse order  (i.e., the 1’s digit is at the head). You need to  add the two numbers  and return the  sum as a linked list , also in reverse order. You can assume: There are  no leading zeros , except when the number itself is 0. 2. Examples Example 1 Input:                l1 = [2,4,3]                l2 = [5,6,4]           Interpreting linked lists as numbers (reverse order): l1 represents 342 l2 represents 465 Output:                [7,0,8] Explanation:        ...