581.最短无序连续子数组
- 最短无序连续子数组
难度简单335收藏分享切换为英文关注反馈
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
输入: [2, 6, 4, 8, 10, 9, 15] 输出: 5 解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
1.双指针
- 核心思想还是双指针,i 和 j
a.默认第一个元素为最大值,如果当前元素小于最大值,说明出现逆序情况 也就是3 2 1 这样,right = i
如果没有 则将当前最大值设定为nums[i]
b.默认最后一个元素为最小值,如果当前元素大于最小值,说明也出现逆序情况,也就是 1 3 2
如果没有 则将最小值赋值为nums[length-i-1]
好了 来分析一下时间复杂度 因为只需要一次遍历 所以为O(n)
/***
* 核心思想还是双指针,i 和 j
a.默认第一个元素为最大值,如果当前元素小于最大值,说明出现逆序情况 也就是3 2 1 这样,right = i
如果没有 则将当前最大值设定为nums[i]
b.默认最后一个元素为最小值,如果当前元素大于最小值,说明也出现逆序情况,也就是 1 3 2
如果没有 则将最小值赋值为nums[length-i-1]
好了 来分析一下时间复杂度 因为只需要一次遍历 所以为O(n)
*/
public int findUnsortedSubarray(int[] nums) {
int length = nums.length;
int left = 0, right = -1;
int max = nums[0], min = nums[length-1];
for(int i=0;i<length;i++){
if(nums[i]<max) right = i;
else max = nums[i];
if(nums[length-i-1]>min) left = length-i-1;
else min = nums[length-i-1];
}
return right-left+1;
}