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;
    }
};
经验分享 程序员 微信小程序 职场和发展