问题描述:
给定一个无序数组arr,如果只能再一个子数组上排序,返回如果让arr整体有序,需要排序的最短子数组长度。
例:arr[1,2,5,3,2,4,6,7],需要排序的最短子数组为sub[5,3,2,4],长度为4。
思路:
从右到左遍历无序数组arr,查找出最后一个下标i,该下标之后的数组中最小值小于该下标对应的值。
从左到右遍历无序数组arr,查找出最后一个下标j,该下标之前的数组中最大值大于该下标对应的值。
最短子数组是从下标i到j,长度为j-i+1。
代码:
public static int getMinLength(int[] arr) {
if (arr == null || arr.length < 2) {
return 0;
}
int min = arr[arr.length - 1];
int noMinIndex = -1;
for (int i = arr.length - 2; i != -1; i--) {
if (arr[i] > min) {
noMinIndex = i;
} else {
min = Math.min(min, arr[i]);
}
}
if (noMinIndex == -1) {
return 0;
}
int max = arr[0];
int noMaxIndex = -1;
for (int i = 1; i != arr.length; i++) {
if (arr[i] < max) {
noMaxIndex = i;
} else {
max = Math.max(max, arr[i]);
}
}
return noMaxIndex - noMinIndex + 1;
}
public static void main(String[] args) {
int[] arr = {1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19};
System.out.println(getMinLength(arr));
}