思路一:排序,排完序后找不一致的左端点和右端点
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int n = nums.size();
vector<int> tmp(nums);
sort(tmp.begin(), tmp.end());
int left = 0, right = n - 1;
while (nums[left] == tmp[left]) {
left++;
}
if (left == n) return 0; //如果都一样直接return 0
while (nums[right] == tmp[right]) {
right--;
}
return right - left + 1;
}
};
思路二: 符合时间O(n)的需求
找右端点:满足(左边最大值大于它本身)最右边的点。
左端点:满足(右边最小值小于它本身)最左边的点。
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int n = nums.size();
int _min = INT_MAX, _max = INT_MIN;
int left = -1;
for (int i = n - 1; i >= 0; --i) {
if (_min < nums[i]) {
left = i;
}
_min = min(_min, nums[i]);
}
int right = -1;
for (int i = 0; i < n; ++i) {
if (_max > nums[i]) {
right = i;
}
_max = max(_max, nums[i]);
}
return (left < right) ? right - left + 1 : 0;
}
};