题目要求
解法一:
我们从乱序的序列出发,在乱序的序列中找出最大和最小的值,然后分别从原数组的头和尾部进行遍历,找出乱序最大最小值需要插入的点,就是需要重排序的范围.
Time: O(n) Space: O(1)
代码:
import java.util.*;
class Program {
public static int[] subarraySort(int[] array) {
// Write your code here.
if (array == null || array.length < 2) return new int[] {};
int minOutOfNum = Integer.MAX_VALUE;
int maxOutOfNum = Integer.MIN_VALUE;
for (int i = 0; i < array.length; i++) {
if (isOutOfOrder(i, array[i], array)) {
minOutOfNum = Math.min(minOutOfNum, array[i]);
maxOutOfNum = Math.max(maxOutOfNum, array[i]);
}
}
if (minOutOfNum == Integer.MAX_VALUE) {
return new int[]{-1, -1};
}
int leftIdx = 0;
while (minOutOfNum >= array[leftIdx]) {
leftIdx++;
}
int rightIdx = array.length - 1;
while (maxOutOfNum <= array[rightIdx]) {
rightIdx--;
}
return new int[] {leftIdx, rightIdx};
}
public static boolean isOutOfOrder(int i, int num, int[] array) {
if (i == 0) return num > array[i + 1];
if (i == array.length - 1) return num < array[i - 1];
return num > array[i + 1] || num < array[i - 1];
}
}

该博客探讨了一种从乱序序列中找出最大和最小值,并确定需要重新排序的子数组范围的方法。通过从头尾遍历原数组,确定最大最小值的插入点,达到O(n)的时间复杂度和O(1)的空间复杂度。

368

被折叠的 条评论
为什么被折叠?



