leetcode 581. 最短无序连续子数组

题目链接:leetcode 581

1.题目

给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的 最短 子数组,并输出它的长度。

2.示例

1)示例 1:
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

2)示例 2:
输入:nums = [1,2,3,4]
输出:0

3)示例 3:
输入:nums = [1]
输出:0

4)提示:
1 <= nums.length <= 104
-105 <= nums[i] <= 105

3.分析

我们什么情况下i位置的数字不用发生移动,也就是说排序后i位置上的数字和排序前没有区别。那么我们再搞一个copy的数组排序,就可以得到什么位置不用排序,那么对于最终的答案区间[st,ed]必须满足[0:st],[ed+1:end]之间的位置都是不需要发生移动的,时间复杂度O(nlog n)

代码

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        vector<int> nums1=nums;
        sort(nums1.begin(),nums1.end());
        int minn=nums.size(),maxx=0;
        for(int i=0;i<nums.size();i++)
            if(nums[i]!=nums1[i]){
                minn=min(minn,i);
                maxx=max(maxx,i);
            }
        if(maxx-minn+1<0) return 0;return maxx-minn+1;
    }
};

你可能感兴趣的:(leetcode,leetcode,算法,数据结构)