Title:Shortest Unsorted Continuous Subarray 581
Difficulty:Easy
原题leetcode地址:https://leetcode.com/problems/shortest-unsorted-continuous-subarray/
1. 复制nums数组,然后排序,进行对比。
时间复杂度:O(n)。
空间复杂度:O(n),申请的最长空间长度为n。
/**
* 申请一个鱼nums长度大小一样的数组tmp,将nums中的数据复制过来,之后对tmp排序
* 从头对比tmp与nums的大小,不同则将下标记录下来
* 从尾对比tmp与nums的大小,不同则将下标记录下来
* 最后将上述的两个下标向减加1
* @param nums
* @return
*/
public static int findUnsortedSubarray(int[] nums) {
if (nums == null || nums.length <= 1) {
return 0;
}
int tmp[] = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
tmp[i] = nums[i];
}
Arrays.sort(tmp);
int begin = -1;
int end = -2; // 这里的end必须比begin小1,解决{1, 2, 3, 4}这样的已经排序OK的
for (int i = 0; i < nums.length; i++) {
if (tmp[i] != nums[i]) {
begin = i;
break;
}
}
for (int i = nums.length - 1; i >= 0; i--) {
if (tmp[i] != nums[i]) {
end = i;
break;
}
}
return end - begin + 1;
}
2. 从左到右遍历,设置最大值,如果后面数依次都小于这个最大值,则记住依次遍历到的nums的下标,这个记录的比较大的下标,从右到左遍历,设置最小值,如果后面数依次都大于这个最小值,则记住依次遍历到的nums的下标,这个记录的比较小的下标
时间复杂度:O(n)。
空间复杂度:O(1)。
/**
* 从左到右遍历,设置最大值,如果后面数依次都小于这个最大值,则记住依次遍历到的nums的下标,这个记录的比较大的下标
* 从右到左遍历,设置最小值,如果后面数依次都大于这个最小值,则记住依次遍历到的nums的下标,这个记录的比较小的下标
* @param nums
* @return
*/
public static int findUnsortedSubarray1(int[] nums) {
if (nums == null || nums.length <= 1) {
return 0;
}
int begin = -1;
int end = -2;
int max = nums[0];
int min = nums[nums.length - 1];
for (int i = 0; i < nums.length; i++) {
max = max > nums[i]? max : nums[i];
if (max > nums[i]) {
end = i;
}
min = min < nums[nums.length - i - 1]? min : nums[nums.length - i - 1];
if (min < nums[nums.length - i - 1]) {
begin = nums.length - i - 1;
}
}
return end - begin + 1;
}