581. Shortest Unsorted Continuous Subarray
思路:逐个找出nums[i]>nums[i+1]的点,使用两个变量记录子数组开始和结束的位置,在更新位置时应该一直向前比较,并判断是否达到边界。另外需要注意的点是对于相等的数如何比较,可以分为两种情况,一种是在这个相等数的前面是排好序的,另一种是未排好序的。目前的解决办法是假设是为排序好的,在得到数组的开始和结束位置后再做判断。
class Solution {
public int findUnsortedSubarray(int[] nums) {
if(nums.length==0)
return 0;
int posi=-2,posj=-2;
int max=nums[0];
for(int i=1;i<=nums.length-1;i++){
if(nums[i]>max)
max=nums[i];
else{
int j=i-1;
if(i==1)
posi=-1;
for(j=i-1;j>=0;j--)
if(nums[j]<=nums[i])
break;
if(posi==-2)
posi=j;
else
posi=Math.min(j,posi);
posj=i;
}
}
if(posj-posi==1)
return 0;
else{
int flag=1;
for(int k=posi+2;k<=posj;k++) {
if(nums[k]!=nums[posi+1]) {
flag=0;
break;
}
}
if(flag==1)
return 0;
else
return posj-posi;
}
}
}
分析问题:在未排序的子数组中,最小值肯定不在左端,最大值也不在右端,因此我们先找出在最左边不符合要求的点的位置,再找出在最右端不符合要求的位置,相减加1就是所求长度。
class Solution {
public int findUnsortedSubarray(int[] A) {
int n = A.length, end = -2, max = A[0];
for (int i=1;i<n;i++) {
max = Math.max(max, A[i]);
if (A[i] < max)
end = i;
}
int beg = -1, min = A[n-1];
for(int i=n-2;i>=0;i--){
min=Math.min(min,A[i]);
if(A[i]>min)
beg=i;
}
return end - beg + 1;
}
}