求一个数组的最短无序子数组,左边界是由数组的无序部分的最小元素的位置决定的,右边界是由数组无序部分的最大元素的位置决定的。
所以遍历数组,找到第一个降序开始的最小元素,然后从右开始找第一个升序开始的最大元素,接着找到他们的正确位置,输出长度。
class Solution {
public int findUnsortedSubarray(int[] nums) {
if(nums==null || nums.length==0 || nums.length==1)return 0;
int minValue=Integer.MAX_VALUE;
int maxValue=Integer.MIN_VALUE;
boolean flag=false;
for(int i=1;i<nums.length;i++){
if(nums[i]<nums[i-1]){
flag=true;
}
if(flag)
minValue=Math.min(nums[i],minValue);
}
flag=false;
for(int i=nums.length-1;i>0;i--){
if(nums[i]<nums[i-1]){
flag=true;
}
if(flag){
maxValue=Math.max(nums[i-1],maxValue);
}
}
int minIndex=0;
for(;minIndex<nums.length;minIndex++){
if(nums[minIndex]>minValue){
break;
}
}
int maxIndex=nums.length-1;
for(;maxIndex>=0;maxIndex--){
if(nums[maxIndex]<maxValue){
break;
}
}
return maxIndex-minIndex<0?0:maxIndex-minIndex+1;
}
}