581. 最短无序连续子数组
题目描述
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
输入输出
1 2 3 4 5 6 7 8 9
| 输入:nums = [2,6,4,8,10,9,15] 输出:5 解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
输入:nums = [1,2,3,4] 输出:0
输入:nums = [1] 输出:0
|
基本思路
- 方法1:先将数组排序 再一一对比两个数组里从头到尾和从尾到头哪个元素开始不同
- 方法2:将数组分为左中右段 左右段递增 中段无序
- 从左到右维护一个最大值
max
在进入右段之前遍历到的nums[i]
都是小于max
的 所求的right
就是遍历中最后一个小于max
的值
- 从右到左维护一个最小值
min
在进入左段之前遍历到的nums[i]
都是大于min
的 所求的left
就是遍历中最后一个大于min
的值
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution { public int findUnsortedSubarray(int[] nums) { if (isSorted(nums)) return 0; int[] nums_sorted = new int[nums.length]; System.arraycopy(nums, 0, nums_sorted, 0, nums.length); Arrays.sort(nums_sorted); int left = 0, right = nums.length - 1; while(nums[left] == nums_sorted[left]){ left++; } while(nums[right] == nums_sorted[right]){ right--; } return right-left+1; }
public boolean isSorted(int[] nums) { for (int i = 1; i < nums.length; i++) { if (nums[i] < nums[i - 1]) { return false; } } return true; } }
class Solution { public int findUnsortedSubarray(int[] nums) { int n = nums.length; int maxn = Integer.MIN_VALUE, right = -1; int minn = Integer.MAX_VALUE, left = -1; for(int i = 0; i < n; i++){ if(maxn > nums[i]) right = i; else maxn = nums[i]; if(minn < nums[n - i - 1]) left = n - i - 1; else minn = nums[n - i - 1]; } return right == -1? 0 : right-left+1; } }
|