Cover image for 面试经典150题 P153 寻找旋转排序数组中的最小值

面试经典150题 P153 寻找旋转排序数组中的最小值


时间轴

时间轴

2025-12-04

init

分治

题目:

和寻找峰值类似。

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                // nums 中的所有整数 互不相同                // nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转                int n = nums.size();                int left = 0, right = n - 1, mid = 0;                if (nums[0] <= nums[n - 1]) // 旋转了n次                        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];        }};
评论加载中…