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 } };