要求:给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度
思路:看起来莫名其妙,实际上意思是最大最小值排好就是对的,可以排序后对比左右两边第一次出现不一样的范围,O(nlogn),可以优化到O(n)
数组实际上可以分为三段,有序+无序+有序,如果只找逆序的左右端点行不?不行,因为最左边还要满足最小,最右边满足最大。所以,从左往右遍历,记录最大值,遇到大的则更新,与最大值逆序了则记为右边界。最小值反过来即可
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int minn=INT_MAX;
int maxx=INT_MIN;
int n=nums.size();
int left=0,right=-1;
for(int i=0;i<n;++i){
if(nums[i]>=maxx)maxx=nums[i];
else right=i;
}
for(int i=n-1;i>=0;--i){
if(nums[i]<=minn)minn=nums[i];
else left=i;
}
return right-left+1;
}
};