LeetCode 581. 最短无序连续子数组**

基本思想:

相当于维护三个区间,A,B,C;
要求B中的元素大于A,小于C,且A,C有序;

可以分两个方向扫描,每次确定左边界或者右边界;

例如,确定左边界,则要求,左边界左边的值小于左边 边界的最小值;

例如考虑:
0,1,4,2,3

当从右往左遍历,3,2,可以知道最小值为2,逐个更新;

当遍历到4的时候,发现该值大于最小值,则说明小的值出现在了该值后面,因此该值必定需要排序;

所以left更新到4这个位置;

基本代码:

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int n=nums.size();
        int left=0;
        int right=0;
        int MAXN=-100000;
        int MIXN=100000;
        for(int i=0;i<n;i++){
            if(nums[n-1-i]<=MIXN){
                MIXN=nums[n-i-1];
            }else{
                left=n-i-1;
            }
            if(nums[i]>=MAXN){
                MAXN=nums[i];
            }else{
                right=i;
            }
        }
        if(right==left)
            return 0;
        return right-left+1;
    }
};

你可能感兴趣的:(LeetCode刷题记录,leetcode,c++)