581. 最短无序连续子数组 力扣(中等) sort+首尾记录

581. 最短无序连续子数组

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

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

示例 1:

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

题解:

由题得,对子数组排序后,整个数组升序,也就是说,不需要排序的数字在其对应的位置上,所以只要和排序后的数组,比对一下,就知道哪些数组需要更改,由于题目中是连续子数组,所以只需要找到第一个需要动的数字,和末尾往前第一个需要动的位置,即可。

代码:

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
     vector<int> k;
     k.assign(nums.begin(),nums.end());   // 复制数组
     sort(k.begin(),k.end());             // 排序
     int l=-1,r=-1;  
     for(int i=0;i<nums.size();i++)       // 从头看,找第一个在错误位置上的数字,记录位置
       if (nums[i]!=k[i])  {l=i; break;} 
     for(int i=nums.size()-1;i>=0;i--)    // 从末尾看,第一个在错误位置上的数字,记录位置
       if (nums[i]!=k[i])  {r=i; break;}
     if(l==-1) return 0;                  // 如果数组已经有序
       else return r-l+1;                 // 长度=尾坐标-头坐标+1
    }
};

 

posted on 2021-08-03 14:43  Yxter  阅读(40)  评论(0编辑  收藏  举报

导航