Cover image for Interview Classic 150 Problem 153: Find Minimum in Rotated Sorted Array

Interview Classic 150 Problem 153: Find Minimum in Rotated Sorted Array


Timeline

Timeline

2025-12-04

init

Divide and Conquer

Problem:

Similar to Find Peak Element.

123456789101112131415161718192021222324252627282930313233343536373839
#include <vector>using std::vector;class Solution {    private:        bool isLowest(vector<int> &nums, int index)        {                int n = nums.size();                if (index > 0 && nums[index] < nums[index - 1]) {                        return true;                } else if (index == 0 && nums[index] < nums[n - 1]) {                        return true;                }                return false;        }    public:        int findMin(vector<int> &nums)        {                int n = nums.size();                int left = 0, right = n - 1;                int mid;                while (left <= right) {                        mid = left + (right - left) / 2;                        if (isLowest(nums, mid)) {                                return nums[mid];                        }                        if (nums[mid] > nums[right]) {                                left = mid + 1;                        } else if (nums[mid] < nums[left]) {                                right = mid - 1;                        } else { // nums[left]<= nums[mid] <= nums[right]                                return nums[left];                        }                }                return nums[0];        }};

leetcode hot 100 rewrite

1234567891011121314151617181920212223242526272829303132333435363738
#include <vector>using std::vector;class Solution {    public:        int findMin(vector<int> &nums)        {                // n == nums.length                // 1 <= n <= 5000                // -5000 <= nums[i] <= 5000                // All integers in nums are distinct.                // nums was originally an array sorted in ascending order, and was rotated between 1 and n times.                int n = nums.size();                int left = 0, right = n - 1, mid = 0;                if (nums[0] <= nums[n - 1]) // Rotated n times.                        return nums[0];                while (left <= right) {                        mid = left + (right - left) / 2;                        if (mid > 0 && nums[mid - 1] > nums[mid])                                return nums[mid];                        if (nums[left] < nums[right]) {                                right = left;                        } else {                                if (nums[mid] > nums[right])                                        left = mid + 1;                                else                                        right = mid;                        }                }                return nums[mid];        }};
Loading comments…