对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度.
/* 思路:首先,从左往右遍历数组,单独用一个变量记录遍历过得最大值
* 遇到遍历过的最大值大于当前数的情况,记录这种情况的最右的位置
* 然后从右往左遍历数组,用一个变量记录遍历过得最小值
* 遇到最小值比当前数要小的情况,记录这种情况的最左的位置
* 最做的位置和最右的位置中间的范围就是最短子数组
*
*/
public class 最短子数组 {
public static void main(String[] args) {
int A[]={1,5,4,3,2,6,7,2};
System.out.println(shortestSubsequence(A, A.length));
}
public static int shortestSubsequence(int[] A, int n) {
if (n<=1) {
return 0;
}
int max=A[0];
int min=A[n-1];
int left=0;
int right=0;
for(int i=0;i<n;i++){
if (A[i]>=max) {
max=A[i];
}else{
left=i;
}
}
for(int j=n-1;j>=0;j--){
if (A[j]<=min) {
min=A[j];
}else{
right=j;
}
}
if (left==right) {
return 0;
}
return left-right+1;
}
}