Search in Rotated Sorted Array

Search in Rotated Sorted Array

https://leetcode.com/problems/search-in-rotated-sorted-array/description/

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:

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

My code:

impl Solution {
    pub fn search(nums: Vec<i32>, target: i32) -> i32 {
        search_recursive(&nums, target).map_or(-1, |i| i as i32)
    }
}

fn search_recursive(nums: &[i32], target: i32) -> Option<usize> {
    let n = nums.len();
    if n == 0 {
        return None;
    }
    if nums[0] <= nums[n-1] {
        return nums.binary_search(&target).ok();
    }

    let mid = n / 2;
    search_recursive(&nums[..mid], target).or_else(
        || search_recursive(&nums[mid..], target).map(|i| i + mid)
    )
}

Trae code:

fn search(nums: &[i32], target: i32) -> i32 {
    search_recursive(nums, target, 0, nums.len() as i32 - 1).unwrap_or(-1)
}

fn search_recursive(nums: &[i32], target: i32, left: i32, right: i32) -> Option<i32> {
    if left > right {
        return None;
    }

    let mid = left + (right - left) / 2;
    
    if nums[mid as usize] == target {
        return Some(mid);
    }

    // If left half is sorted
    if nums[left as usize] <= nums[mid as usize] {
        if nums[left as usize] <= target && target < nums[mid as usize] {
            search_recursive(nums, target, left, mid - 1)
        } else {
            search_recursive(nums, target, mid + 1, right)
        }
    } 
    // Else right half must be sorted
    else {
        if nums[mid as usize] < target && target <= nums[right as usize] {
            search_recursive(nums, target, mid + 1, right)
        } else {
            search_recursive(nums, target, left, mid - 1)
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值