Find Minimum in Rotated Sorted Array
Problem
You are given an array of length n which was originally sorted in ascending order. It has now been rotated between 1 and n times. For example, the array nums = [1,2,3,4,5,6] might become:
[3,4,5,6,1,2]if it was rotated4times.[1,2,3,4,5,6]if it was rotated6times.
Notice that rotating the array 4 times moves the last four elements of the array to the beginning. Rotating the array 6 times produces the original array.
Assuming all elements in the rotated sorted array nums are unique, return the minimum element of this array.
A solution that runs in O(n) time is trivial, can you write an algorithm that runs in O(log n) time?
Examples
Example 1:
Input: nums = [3,4,5,6,1,2]
Output: 1
Example 2:
Input: nums = [4,5,0,1,2,3]
Output: 0
Example 3:
Input: nums = [4,5,6,7]
Output: 4
Constraints
1 <= nums.length <= 1000-1000 <= nums[i] <= 1000
You should aim for a solution with O(logn) time and O(1) space, where n is the size of the input array.
Solution
Use the midpoint to check if its less than the right window. If so, that tells us the right side is monotonically increasing and the jump point must be on the left hand size.
class Solution {
public:
int findMin(vector<int> &nums) {
std::size_t l = 0;
std::size_t r = nums.size() - 1;
// Binary search
// If middle < right, then its monotonically increasing on the right side,
// and the jump (min element) must be on the left side
while (l < r) {
const auto m = std::midpoint(l, r);
if (nums[m] < nums[r]) {
r = m;
} else {
l = m + 1;
}
}
return nums[l];
}
};