题目
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长
总结
将给定的数组nums表示为三段子数组拼接的形式,分别记作A、B、C,找到最短的B即可。
关注点在于B的范围[left,right]
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int n=nums.size();
int left=-1,right=-1;
int minVal=INT_MAX,maxVal=INT_MIN;
for(int i=0;i<n;i++){
//从左往右遍历,寻找right,right可以表示为一个i,nums[i]<leftMax(i左侧的最大值)。
if(nums[i]<maxVal){
right=i;
}else{
maxVal=nums[i];
}
//从右往左遍历,寻找left,left可以表示为一个i,nums[i]>rightMin(i右侧的最小值)。
if(nums[n-i-1]>minVal){
left=n-i-1;
}else{
minVal=nums[n-i-1];
}
}
//A、C可能为空集
return right==-1?0:right-left+1;
}
};