自己解答
有点错误,某些用例过不了,和官解区别在于它left从-1开始,并且定义了一个常量。这样能解决边界的问题
class Solution {
public int findUnsortedSubarray(int[] nums) {
//子数组里最小数大于左边所有数,最大数小于右边所有数
int len = nums.length;
int left = 0, right = len - 1;
while (left + 1 < len && nums[left] < nums[left + 1]) {
left++;
}
if (left == len - 1) {
return 0;
}
while (right - 1 >= 0 && nums[right] > nums[right - 1]) {
right--;
}
for (int i = left + 1; i < right; i++) {
while (left >= 0 && nums[i] < nums[left]) {
left--;
}//会出现left=-1
while (right < len && nums[i] > nums[right]) {
right++;
}
}
return right - left - 1;
}
}
官方解答
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++) {
//右边子数组里的最小值大于左边两部分所有元素中的最大值
//maxn是已遍历的元素中的最大值,即左边两部分中的最大值
if (maxn > nums[i]) {
right = i;
} else {
maxn = nums[i];
}
//左边子数组里的最大值小于右边两部分所有元素中的最小值
//minn是已遍历元素中的最小值,因为是从右往左
if (minn < nums[n - i - 1]) {
left = n - i - 1;
} else {
minn = nums[n - i - 1];
}
}
return right == -1 ? 0 : right - left + 1;
}
}