描述
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
分析
方法一:拷贝数组再排序,双指针找两个数组两端数值不相同的下标。
方法二:先通过双指针 i 和 j 找到左右两次侧满足单调递增的分割点,然后遍历中间这段的区间,若遇到比左边界更小的数更新左边界,同理更新右边界。
- 用双指针确定左右单调界限时,遇到相等的数不要停止,仍然视作单调递增继续遍历。
- 为了结果统一是右边界减去左边界再减1,需要设置两个最大最小值。
在调整 i 和 j 的时候,我们可能会到达数组边缘,这时候可以建立两个哨兵:数组左边存在一个足够小的数,数组右边存在一个足够大的数。
class Solution {
public int findUnsortedSubarray(int[] nums) {
int n = nums.length;
int[] arr = new int[n+2];
for(int i = 0; i < n; i++){
arr[i+1] = nums[i];
}
arr[0] = Integer.MIN_VALUE;
arr[n+1] = Integer.MAX_VALUE;
int l = 1, r = n;
while(l < n){
if(arr[l] > arr[l+1]){
break;
}
l++;
}
while(r > 0){
if(arr[r] < arr[r-1]){
break;
}
r--;
}
if(l > r){
return 0;
}
for(int j = l; j <= r; j++){
while(arr[j] < arr[l]){
l--;
}
while(arr[j] > arr[r]){
r++;
}
}
return r - l - 1;
}
}