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; } };
下一篇:
什么是数组?如何声明和使用数组?