Post

153 Find Minimum In Rotated Sorted Array

153 Find Minimum In Rotated Sorted Array

Find Minimum in Rotated Sorted Array image

Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,2,4,5,6,7] might become:

1
2
[4,5,6,7,0,1,2] if it was rotated 4 times.
[0,1,2,4,5,6,7] if it was rotated 7 times.

Notice that rotating an array [a[0], a[1], a[2], …, a[n-1]] 1 time results in the array [a[n-1], a[0], a[1], a[2], …, a[n-2]].

Given the sorted rotated array nums of unique elements, return the minimum element of this array.

You must write an algorithm that runs in O(log n) time.

 

Example 1:

1
2
3
4
5
**Input:** nums = [3,4,5,1,2]
**Output:** 1
**Explanation:** The original array was [1,2,3,4,5] rotated 3 times.

Example 2:

1
2
3
4
5
**Input:** nums = [4,5,6,7,0,1,2]
**Output:** 0
**Explanation:** The original array was [0,1,2,4,5,6,7] and it was rotated 4 times.

Example 3:

1
2
3
4
5
**Input:** nums = [11,13,15,17]
**Output:** 11
**Explanation:** The original array was [11,13,15,17] and it was rotated 4 times. 

 

Constraints:

1
2
3
4
5
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
All the integers of nums are **unique**.
nums is sorted and rotated between 1 and n times.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

use std::cmp;

impl Solution {
    pub fn find_min(nums: Vec<i32>) -> i32 {
        // if mid > right -> then mid lies between or left of mid
        // if mid < right -> 
        // if mid > left -> ignore it
        // if mid < left -> interesting

        let mut left = 0;
        let mut right = nums.len() - 1;
        let mut mid = 0;
        if nums.len() <= 3 {
            return cmp::min(nums[left], cmp::min(nums[right], nums[(left + right)/2]));
        }
        while(left + 1 < right) {
            //println!("{} {} {}", mid , left, right);
            mid = (right + left ) / 2;
            if nums[mid] < nums[mid + 1] && nums[mid] < nums[mid-1] {
                return nums[mid];
            }
            if nums[mid] > nums[right] {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
            
        }
        return cmp::min(nums[left], nums[right]);
    }
}



This post is licensed under CC BY 4.0 by the author.