LeetCode-in-Rust

33. Search in Rotated Sorted Array

Medium

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:

Solution

impl Solution {
    pub fn search(nums: Vec<i32>, target: i32) -> i32 {
        let mut lo = 0;
        let mut hi = nums.len() as i32 - 1;

        while lo <= hi {
            let mid = lo + ((hi - lo) >> 1); // Calculate mid index

            if nums[mid as usize] == target {
                return mid; // Target found, return the index
            }

            // If the left half is sorted
            if nums[lo as usize] <= nums[mid as usize] {
                // Check if the target lies within the sorted left half
                if nums[lo as usize] <= target && target <= nums[mid as usize] {
                    hi = mid - 1; // Target is in the left half
                } else {
                    lo = mid + 1; // Move to the right half
                }
            } else {
                // If the right half is sorted
                if nums[mid as usize] <= target && target <= nums[hi as usize] {
                    lo = mid + 1; // Target is in the right half
                } else {
                    hi = mid - 1; // Move to the left half
                }
            }
        }

        -1 // Target not found
    }
}