LeetCode: 154. Find Minimum in Rotated Sorted Array II

本文详细解析了LeetCode 154题“在旋转排序数组中寻找最小值II”的解题思路及实现方法,针对含有重复元素的情况采用折半查找算法,并附带AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode: 154. Find Minimum in Rotated Sorted Array II

题目描述

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
Find the minimum element.
The array may contain duplicates.

Example 1:

Input: [1,3,5]
Output: 1

Example 2:

Input: [2,2,2,0,1]
Output: 0

Note:

This is a follow up problem to Find Minimum in Rotated Sorted Array.
Would allow duplicates affect the run-time complexity? How and why?

题目大意: 求出经过旋转的有序数组的最小值(数组中含有重复元素)

解题思路 —— 折半查找

旋转后的数组有一下几种可能,其中 [beg, end) 是查找 nums 数组的最小值的区间, mid=(beg+end)/2

  • nums[mid] == nums[beg] && nums[beg] >= nums[end-1]: 最小值可能在 mid 的左边,也可能在 mid 的右边。
    (1) 最小值在 mid 左边:
    minLeft
    (2) 最小值在 mid 右边:
    minRight

  • nums[mid] < nums[beg] && nums[beg] >= nums[end-1]: 最小值在 mid 的左边。
    这里写图片描述

  • nums[mid] > nums[beg] && nums[beg] >= nums[end-1]: 最小值在 mid 的右边。
    这里写图片描述

  • 其他(升序):最小值在最左边(nums[beg])。
    这里写图片描述

AC 代码

class Solution {
private:
    // 返回 nums 区间 [beg, emd) 的最小值
    int findMin(const vector<int>& nums, int beg, int end)
    {
        if(beg >= end) return INT_MAX;
        if(beg + 1 == end) return nums[beg];

        int mid = (beg+end)/2;

        // nums[mid] == nums[beg] >= nums[end-1] 的情况, 最小值可能在 mid 左边和右边
        // (1) 1 1 1 1 1 1, mid = (0+6)/2
        // (2) 1 1 1 1 0 1, mid = (0+6)/2
        // (3) 1 2 0 1 1 1, mid = (0+6)/2
        if(nums[mid] == nums[beg] && nums[beg] >= nums[end-1])
        {
            return min(findMin(nums, beg, mid), findMin(nums, mid, end));
        }
        // nums[mid] > nums[beg] >= nums[end-1] 的情况, 最小值在 mid 的右边
        // 1 1 2 3 0 1, mid = (0+6)/2
        else if(nums[mid] > nums[beg] && nums[beg] >= nums[end-1])
        {
            if(beg == mid) return nums[beg];
            return findMin(nums, mid, end);
        }
        // nums[mid] < nums[beg] >= nums[end-1] 的情况, 最小值在 mid 左边
        // 1 2 3 0 1 2, mid = (0+6)/2
        else if(nums[mid] < nums[beg] && nums[beg] >= nums[end-1])
        {
            if(mid == end-1) return nums[mid];
            return findMin(nums, beg, mid+1);
        }
        // 其他(升序): nums[beg] < nums[mid] < nums[end]
        else
        {
            return nums[beg];
        }
    }
public:
    int findMin(vector<int>& nums) {
        return findMin(nums, 0, nums.size());
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值