问题描述:
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
示例 :
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
思路:
维护两个单调栈,一个是数组从左到右遍历的递增栈s(只有大于等于栈顶的数据才可以入栈),一个是数组从右往左遍历的递减栈s2(只有小于等于栈顶的数据才可以入栈)。还有一个要求s栈顶数据小于等于栈以外所有数据,s2栈顶数据大于等于栈以外所有数据。
实现:
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
int Min = nums[0];
int Max = nums[nums.size() - 1];
stack<int> s;
stack<int> s2;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] >= Min) {
s.push(nums[i]);
Min = nums[i];
}
else {
while (!s.empty() && s.top() > nums[i]) {
s.pop();
}
for (int j = i; j < nums.size(); j++) {
while (!s.empty() && s.top() > nums[j]) {
s.pop();
}
}
break;
}
}
if (s.size() == nums.size()) {
return 0;
}
for (int i = nums.size() - 1; i >= 0; i--) {
if (nums[i] <= Max) {
s2.push(nums[i]);
Max = nums[i];
}
else {
while (!s2.empty() && s2.top() < nums[i]) {
s2.pop();
}
for (int j = i; j >= 0; j--) {
while (!s2.empty() && s2.top() < nums[j]) {
s2.pop();
}
}
break;
}
}
return nums.size() - s2.size() - s.size();
}
};