给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。
示例:
输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]
解题步骤
1、从前往后,如果后面的数小于前面的数,肯定就是不正常的数,记录下标,上面一组数据,是从 7到最后一个7之间混乱的,7--7之间最大的是12,如果后面有小于12的肯定就是不正常的数组,当循环到16的时候,最大变成16,但是后面没有小于16的了,所以下标仍然在7 这个位置
2、从后往前,如果前面的数大于后面的数,肯定就是不正常的数,所以记录下标,从数组的最后开始找最小的数,找到了7这个位置,如果后面的数字比7小,重新定义最小值,如果比最小值大,就是不正常的数字,重新定义下标,这个下标就是不正常的数字下标
class Solution {
public int[] subSort(int[] array) {
if(array == null || array.length == 0) return new int[]{-1, -1};
int last = -1, first = -1;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int len = array.length;
for(int i = 0; i < len; i++){
if(array[i] < max){ //从前往后,如果后面的数小于前面的数,肯定就是不正常的数,所以记录下标
last = i;
}else{
max = Math.max(max, array[i]);
}
if(array[len - 1 - i] > min){//从后往前,如果前面的数大于后面的数,肯定就是不正常的数,所以记录下标
first = len - 1 - i;
}else{
min = Math.min(min, array[len - 1 - i]);
}
}
return new int[] {first, last};
}
}