题目:
给定一个整数数组,编写一个函数,找出索引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]
提示:
0 <= len(array) <= 1000000
Related Topics
栈
贪心
数组
双指针
排序
单调栈
解体思路:
需要对数组进行循环,找到m,n的对应的位置。
1.寻找m的位置 从结尾向开头找,找到每个值都小于后面值的最大位置。
2.寻找n的位置,从开头向结尾找,令m后面的所有的值都大于之前的值最大小位置。
3.返回 m,n的值。
代码:
public int[] subSort(int[] array) {
//设置默认m,n的位置都为-1
int left = -1;
int right = -1;
//设定一个最大值,和最小值,用来判断是否前面的值大于或者小于,到当前位置的最大值,或者最小值。
int valueMax = Integer.MAX_VALUE;
int valueMin = Integer.MIN_VALUE;
int len = array.length;
for (int i = 0; i < len; i++) {
//找到最大值,并找到n的位置。
//如果当前位置的数据小于迄今为止的最大值,则证明之前的数据无法进行排序。移动位置。
if (array[i] < valueMin) {
left = i;
} else {
valueMin = Math.max(array[i], valueMin);
}
//找到最小值,找到m的位置。
//这里使用的双判断,同时移动m,n循环一次就可以得到结果。
//如果当前位置的数据大于迄今为止的最小值,则证明之后的数据无法进行排序。移动位置。
if (array[len - i - 1] > valueMax) {
right = len - i - 1;
} else {
valueMax = Math.min(array[len - i - 1], valueMax);
}
}
return new int[]{right, left};
}