题目
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
示例
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
输入:nums = [1,2,3,4] 输出:0
输入:nums = [1] 输出:0
解决方法
如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。-> 在整个数组中,除了这个子数组以外,其他的部分都是升序排列的,分布在数组的左右两边。同时,这个子数组的最小值大于左边升序数组,最大值小于右边的升序数组。
- 维护两个端点,初始化为最大值和最小值,分别为left,right
- 从左往右遍历 遇到一个数就更新一下最大值,找到第一个小于最大值的存在,我们设置为right
- 从右往左遍历 遇到一个数就更新一下最小值,找到第一个大于最小值的存在,我们设置为left
- 比较right-left的值,如果是小于的话, 就返回0 不是的话,就直接返回差
代码实现
class Solution {
public int findUnsortedSubarray(int[] nums) {
int len = nums.length;
if(len == 1 || len == 0) return 0;
int left = 0;
int right = -1;
int min = 1000000;
int max = -1000000;
for(int i = 0;i < len;i ++){
if(nums[i] >= max){
max = nums[i];
}
else{
right = i;
}
}
for(int j = len - 1;j >= 0;j --){
if(nums[j] <= min){
min = nums[j];
}
else{
left = j;
}
}
return right > left ? right-left +1 : 0;
}
}