LeetCode/最短无序连续子数组

给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的最短 子数组,并输出它的长度

1. 排序后比较

先排序,再分别找第一个不在位的的元素,做差

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        if(nums.size()<=1) return 0;
        vector<int> temp = nums;
        sort(temp.begin(),temp.end());
        int i = 0;
        int j = nums.size()-1;
        while(i<j){
            bool flag = false;
            if(nums[i]==temp[i]){ i++; continue;}
            if(nums[j]==temp[j]){ j--; continue;}
            break;
        }
        if(i>=j) return 0;
        return j-i+1;
    }
};

2. 一趟遍历

由于我们要找的是最远不在位元素,可以一边记录当前最值,一边进行比较,所以无序排序

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int n = nums.size();
        int maxn = INT_MIN, right = -1;
        int minn = INT_MAX, left = -1;
        for (int i = 0; i < n; i++) {//已遍历最大值大于当前值,说明当前值不在位
            if (maxn > nums[i])  right = i;//从左往右,得到无序右边界
            else    maxn = nums[i];//更新当前最大值
            
            if (minn < nums[n - i - 1]) //已遍历最小值小于当前值,说明当前值不在位
                left = n - i - 1; //从右往左,得到无序左边界
            else minn = nums[n - i - 1];//更新当前最小值
            
        }
        return right == -1 ? 0 : right - left + 1;
    }
};
posted @ 2022-07-06 22:08  失控D大白兔  阅读(14)  评论(0编辑  收藏  举报