题目分析
寻找未排序的部分 == 寻找逆序对,且最远的逆序对
- 最右边位置:最右逆序对的位置
- 最左边位置:从右往左的逆序对
- 左 --> 右
- 扫描过的最大值是:8 如果发现当前值小于最大值,记录它的位置(2)
- 右 --> 左
- 扫描过的最小值是:1 如果发现当前值大于最小值,记录它的位置(5)
- 并且当 r == -1 时,即说明没有逆序对,直接返回 [-1,-1]
Solution
public int[] subSort(int[] nums) {
if (nums.length == 0) return new int[] { -1, -1 };
// 从左扫描到右寻找逆序对(正序:逐渐变大)
int max = nums[0];
// 用来记录最右的那个逆序对位置
int r = -1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] >= max) {
max = nums[i];
} else {
r = i;
}
}
// 提前结束
if (r == -1) return new int[] { -1, -1 };
// 从右扫描到左寻找逆序对(正序:逐渐变小)
int min = nums[nums.length - 1];
// 用来记录最左的那个逆序对位置
int l = -1;
for (int i = nums.length - 2; i >= 0; i--) {
if (nums[i] <= min) {
min = nums[i];
} else {
l = i;
}
}
return new int[] { l, r };
}
Reference:小码哥MJ