具体思路:
单调栈思路好理解,但是题解用的是两次遍历;
举例来说:对于右边界,必定是出现在了前半边最大值的右边;
因此,如果记录当前最大值,如果array[i]小于最大值,则记其为右边界,否则则更新最大值;
具体代码:
1.单调栈:
class Solution {
public:
vector<int> subSort(vector<int>& array) {
if(array.size()<2)
return {-1,-1};
vector<int>st;
int maxn=INT_MIN;
for(int i=0;i<array.size();i++){
while(!st.empty()&&array[i]<array[*st.rbegin()]){
maxn=max(maxn,array[*st.rbegin()]);
st.pop_back();
}
st.push_back(i);
}
int s=-1;
int e=-1;
for(int i=0;i<st.size();i++){
s=i;
if(st[i]!=i)
break;
}
for(int i=st.size()-1;i>=0;i--){
int index=st[i];
if(array[index]<maxn){
e=index;
break;
}
}
if(s==-1||e==-1){
return {-1,-1};
}
return {s,e};
}
};
2.两次遍历思路:
class Solution {
public:
vector<int> subSort(vector<int>& array) {
int maxn=INT_MIN;
int minx=INT_MAX;
int start=-1,last=-1;
for(int i=0;i<array.size();i++){
if(array[i]>=maxn){
maxn=max(array[i],maxn);
}else{
last=i;
}
}
for(int i=array.size()-1;i>=0;i--){
if(array[i]<=minx){
minx=min(array[i],minx);
}else{
start=i;
}
}
if(start==-1||last==-1)
return {-1,-1};
return {start,last};
}
};