581. 最短无序连续子数组
一、暴力解法
复制数组排序,然后找不同。时间复杂度大于O(n)
如果限制时间,那么需要其他的思路。
class Solution {
public int findUnsortedSubarray(int[] nums) {
int low =-1;
int high = -1;
int ans = 0;
int len = nums.length;
int[] sorted = new int[len];
//边界条件
if(len<2)return 0;
for(int i = 0;i<len;i++){
sorted[i]=nums[i];
}
Arrays.sort(sorted);
for(int i=0;i<nums.length;i++){
//[1,3,2,3,3]
if(nums[i]!=sorted[i]){
low = i;
break;
}
}
for(int i=nums.length-1;i>0;i--){
//
//[1,3,2,2,2]
if(nums[i]!=sorted[i]){
high = i;
break;
}
}
System.out.println(low+"-"+high);
if(low!=-1&&low!=-1){
ans = high -low+1;
}
//[2,1]
return ans;
}
}
二、时间复杂度为O(n)的解法
get到了大佬的写法、
思考[1,3,2,3,3]
题解如何解决这种用例的?
class Solution {
public int findUnsortedSubarray(int[] nums) {
int n = nums.length;
int maxn = Integer.MIN_VALUE, right = -1;
int minn = Integer.MAX_VALUE, left = -1;
for (int i = 0; i < n; i++) {
if (maxn > nums[i]) {
right = i;
} else {
maxn = nums[i];
}
if (minn < nums[n - i - 1]) {
left = n - i - 1;
} else {
minn = nums[n - i - 1];
}
}
return right == -1 ? 0 : right - left + 1;
}
}