思路:
1.创建一个新array,保存排好序的数组,逐个比较哪个下标的值变化了
2.双指针
代码:
public class Solution {
public int findUnsortedSubarray(int[] nums) {
int min=Integer.MAX_VALUE,max=Integer.MIN_VALUE;
boolean flag=false;
for(int i=1;i<nums.length;i++){
if(nums[i]<nums[i-1]){
flag=true;
}
if(flag){
min=Math.min(min,nums[i]);
}
}
//注意,这里要重新变为false
flag=false;
for(int i=nums.length-2;i>=0;i--){
if(nums[i]>nums[i+1]){
flag=true;
}
if(flag){
max=Math.max(max,nums[i]);
}
}
int l,r;
//找到min和max后,从左到右以及从右到左找到界限
for(l=0;l<nums.length;l++){
if(min<nums[l]){
break;
}
}
for(r=nums.length-1;r>=0;r--){
if(max>nums[r]){
break;
}
}
return r-l>0?r-l+1:0;
}
}
分解:
1)找max和min:
当nums[i]<nums[i-1]时,不断更新min
当nums[i+1]<nums[i]时,不断更新max
找边界:
当第一个nums[l]>min和第一个nums[r]<max就找到了左右边界l和r
复杂度分析:
时间复杂度:O(N)
空间复杂度:O(1)