leetcode(581)--Shortest Unsorted Continuous Subarray

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        /*
        //方法1
        vector<int> temp=nums;
        sort(nums.begin(),nums.end());
        int left=-1,right=-2;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]!=temp[i]&&left==-1)
                left=i;
            else if(nums[i]!=temp[i])
                right=i;
        }
        return right-left+1;
        */
        //方法2
        int n=nums.size(),left=-1,right=-2,_max=nums[0],_min=nums[n-1];
        for(int i=1;i<nums.size();i++)
        {
            _max=max(nums[i],_max);
            _min=min(nums[n-i-1],_min);
            if(_max>nums[i])
                right=i;
            if(_min<nums[n-i-1])
                left=n-i-1;
        }
        return right-left+1;
        
    }
};

第二种方法O(n)的复杂度,方法很巧妙,因为乱序数组出现的原因就是小的数变到了大的数的右边,大的数变到了小的数的左边,所以我们只需要找到比当前右边最小数大的位于最左边的数,找到比当前左边最大数小的位于最右边的数就行了,这样我们分别从输入数组的右端到左端,从左端到右端遍历数组,就可以分别把subarray的左端和右端找出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值