Leetcode-Find Minimum in Rotated Sorted Array && Find Minimum in Rotated Sorted Array II

本文探讨了在未知旋转点的升序数组中寻找最小元素的问题,并分别讨论了数组无重复与含重复元素两种情况下的解决方案及复杂度分析。

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

problem

Find Minimum in Rotated Sorted Array

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.

You may assume no duplicate exists in the array.
详见Leetcode

Find Minimum in Rotated Sorted Array II

Follow up for “Find Minimum in Rotated Sorted Array”:
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?
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.
详见Leetcode

Analysis

Find Minimum in Rotated Sorted Array

因为题目给出的序列是相对有序,所以我们依然可以采用二分搜索的方式来查找。首先判断当前中间的那个元素是否比我们现在所拥有的最小值小,如果是这样的话,更新最小值。然后判断现在搜索区间的中心元素是否比最后一个元素大,如果中心元素比最后一个元素大的话,说明最小值在后面的区间,否则,最小值将落在前半区间。判断后根据结果缩小搜索范围,一直到找到最小值为止。

Find Minimum in Rotated Sorted Array II

与上面的基础问题不同的是,当数组中出现重复元素的时候就不容易直接通过判断中间元素和最后的元素的大小来判断应该搜索哪一个空间,所以,如果两个元素相等的话,前后都需要搜索。

Complexity

Find Minimum in Rotated Sorted Array

时间复杂度: O(log2n)
空间复杂度: O(1)

Find Minimum in Rotated Sorted ArrayII

时间复杂度:最好情况是 O(log2n) ,最坏情况是 O(n)
空间复杂度: O(1)

Code

Find Minimum in Rotated Sorted Array

class Solution {
public:
    void biSearch(vector<int>& nums, int start, int end) {
        int mid = (start+end) /2;
        if (start>end) return;
        if (nums[mid] < min) min = nums[mid];

        if (nums[mid] > nums[end]) {
            biSearch(nums,mid+1,end);
        } else {
            biSearch(nums,start,mid-1);
        }
    }
    int findMin(vector<int>& nums) {
        index = -1;
        if (nums.size()!=0) min = nums[0];
        else return -1;
        biSearch(nums,0,nums.size()-1);
        return min;
    }
private:
    int index;
    int min;
};

Find Minimum in Rotated Sorted Array II

class Solution {
public:
    void biSearch(vector<int>& nums, int start, int end) {
        int mid = (start+end) /2;
        if (start>end) return;
        if (nums[mid] < min) min = nums[mid];

        if (nums[mid] > nums[end]) {
            biSearch(nums,mid+1,end);
        } else if (nums[mid] < nums[end]){
            biSearch(nums,start,mid-1);
        } else {
            biSearch(nums,mid+1,end);
            biSearch(nums,start,mid-1);
        }
    }
    int findMin(vector<int>& nums) {
        index = -1;
        if (nums.size()!=0) min = nums[0];
        else return -1;
        biSearch(nums,0,nums.size()-1);
        return min;
    }
private:
    int index;
    int min;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值