- 581. 最短无序连续子数组 中等

解法1: 排序
- 先检查数组是否已经是有序的,如果是有序的就返回0,
- 否则,复制一份原数组并对其进行排序。
- 然后,从左边开始找到第一个不匹配的元素,以及从右边开始找到第一个不匹配的元素,它们之间的区间就是未排序的连续子数组。
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
if (is_sorted(nums.begin(), nums.end())) {
return 0;
}
vector<int> numsSorted(nums);
sort(numsSorted.begin(), numsSorted.end());
int left = 0;
while (nums[left] == numsSorted[left]) {
left++;
}
int right = nums.size() - 1;
while (nums[right] == numsSorted[right]) {
right--;
}
return right - left + 1;
}
};

解法2: 一次遍历
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int n = nums.size()
int maxn = INT_MIN, right = -1
int minn = INT_MAX, left = -1
for (int i = 0
// 从左往右遍历数组,找到不按照升序排序的最大值和右边界
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]
}
}
// 如果 right 仍然等于 -1,表示数组已经有序,返回 0
return right == -1 ? 0 : right - left + 1
}
}
