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的左端和右端找出来。