题目:最短无序连续子数组
分析
我们可以假设把这个数组分成三段,左段
和右段
是标准的升序数组,中段
数组虽是无序的,但满足最小值大于左段
的最大值,最大值小于右段
的最小值。
那么我们目标就很明确了,找中段的左右边界,我们分别定义为begin
和 end
;
分两头开始遍历:
- 从左到右维护一个最大值
max,
在进入右段之前,那么遍历到的nums[i]
都是小于max
的,我们要求的end
就是遍历中最后一个小于max
元素的位置; - 同理,从右到左维护一个最小值
min
,在进入左段之前,那么遍历到的nums[i]也都是大于min
的,要求的begin
也就是最后一个大于min
元素的位置。
代码
class Solution {
public int findUnsortedSubarray(int[] nums) {
//初始化
int len = nums.length;
int min = nums[len-1];
int max = nums[0];
int begin = 0, end = -1;
//遍历
for(int i = 0; i < len; i++){
if(nums[i] < max){ //从左到右维持最大值,寻找右边界end
end = i;
}else{
max = nums[i];
}
if(nums[len-i-1] > min){ //从右到左维持最小值,寻找左边界begin
begin = len-i-1;
}else{
min = nums[len-i-1];
}
}
return end-begin+1;
}
}