最短无序连续子数组
你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
解题思路:
找最小子数组,首先对整个数组进行排序,原数组跟排序之后的数组之间不同的就是需要交换顺序的部分,那么既然要找最小的连续子数组,那么就相当于要找最大相同前缀跟最大相同后缀。
public static int findUnsortedSubarray(int[] nums) {
if (nums.length == 1) {
return 0;
}
int[] numTemp = new int[nums.length];
for (int i = 0 ; i < nums.length; i++) {
numTemp[i] = nums[i];
}
Arrays.sort(nums);
int begin = 0;
int end = 0;
for (int i = 0 ; i < nums.length; i++) {
if (nums[i] != numTemp[i]) {
begin = i;
break;
}
}
for (int i = nums.length - 1 ; i >= 0; i--) {
if (nums[i] != numTemp[i]) {
end = i;
break;
}
}
if (begin == 0 && end == 0) {
return 0;
}
return end - begin + 1;
}