https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/
题目描述给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组,并输出它的长度。 示例 1: 输入:nums = [2,6,4,8,10,9,15] 输出:5 解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。 示例 2: 输入:nums = [1,2,3,4] 输出:0 示例 3: 输入:nums = [1] 输出:0 提示: 1 <= nums.length <= 104 -105 <= nums[i] <= 105 进阶:你可以设计一个时间复杂度为 O(n) 的解决方案吗?关键点
- 左边有序 则存在 左边有序区域的所有元素小于 右边区域的某个最小值。右往左遍历 start + min
- 右边有序 则存在 右边有序区域的所有元素大于 左边区域的某个最大值。左往右遍历 end + max
- 语言支持:Java
Java Code:
class Solution {
public int findUnsortedSubarray(int[] nums) {
if(nums.length==1) return 0;
int start = 0;
int end = -1;
int max= nums[0];
int min = nums[nums.length-1];
for(int i=0;i
if(nums[i] < max ){
end = i;
}else{
max = nums[i];
}
if(nums[nums.length-1-i] > min){
start = nums.length-1-i;
}else{
min = nums[nums.length-1-i];
}
}
return end - start + 1;
}
}
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)



