题目(难度:简单):
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
代码思想:
试想,数组中存在零个或多个逆序对,使得数组不能够保持升序,而找到这个逆序区间就是第一个逆序对的第一个数到最后一个逆序对的最后一个数,有这个思路后,利用左右两个指针,先循环一遍数组,找到第一个逆序对的左边界,再循环一遍数组,找到最后一个逆序对的右边界。
代码实现:
public int findUnsortedSubarray(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int left = nums.length;
int right = -1;
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= max) {
max = nums[i];
} else {
right = i;
}
}
for (int i = nums.length - 1; i >= 0; --i) {
if (nums[i] <= min) {
min = nums[i];
} else {
left = i;
}
}
return right > left ? right - left + 1 : 0;
}
测试用例:
算法分析:
时间复杂度O(n),空间复杂度O(1)