581.最短无序连续子数组

该博客讨论了一种算法,用于找出数组中未排序的最小子数组的长度。通过一次遍历,确定左边界和右边界,从而确定不连续子数组。时间复杂度为O(nlogn),空间复杂度为O(n)。适用于数组处理和算法优化场景。

在这里插入图片描述
解题思路

1 排序再比较两个数组,找到不同的元素个数返回即可。
时间复杂度:快速排序O(nlogn)
空间复杂度:O(n)

2 一次遍历,找到左边界和右边界,观察可知,左边界的值大于右边的某一最小值,但是左边界左边的值全部小于等于这个最小值。
即 if(nums[i]>min_val) left=i;
if(nums[i]<=min_val) min_val=nums[i];

同理得到右边界。

假如原数组本来就是升序,那么left=-1;返回0;

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int max_val=INT_MIN,min_val=INT_MAX;
        int left=-1,right=-1;
        int n=nums.size();
        for(int i=0;i<n;++i){
            //确认右边界
            //从左边开始,右边界的值一定会小于左边的最大值
            if(nums[i]<max_val)
                right=i;
            else
                max_val=nums[i];
            
            //确认左边界
            //从右边开始,左边界的值一定会大于右边的最小值
            if(nums[n-1-i]>min_val)
                left=n-1-i;
            else    
                min_val=nums[n-1-i];
        }
        return left==-1?0:right-left+1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值