题目:
分析:
自己想到了先找不按照熟顺序的,然后两边不断移动。
最简单的方法当然是排序啦!
代码1.排序水题:
class Solution {
public:
vector<int> subSort(vector<int>& array) {
vector<int> v=array;
sort(v.begin(),v.end());
vector<int> ans={-1,-1};
for(int i=0;i<v.size();i++)
{
if(array[i]!=v[i])
{
ans[0]=(i);
break;
}
}
for(int i=v.size()-1;i>=0;i--)
{
if(array[i]!=v[i])
{
ans[1]=(i);
break;
}
}
return ans;
}
};
代码2:双指针:需要移动三次,注意自己认真分析:
class Solution {
public:
vector<int> subSort(vector<int>& array) {
vector<int> ans={-1,-1};
if(array.size()<=1) return ans;
int i=0;
for(;i<array.size()-1;i++)
if(array[i]>array[i+1]) break;
if(i==array.size()-1) return ans;
int j=array.size()-1;
for(;j>0;j--)
if(array[j]<array[j-1]) break;
cout<<i<<' '<<j<<endl;
int maxx=array[i],minn=array[i];
for(int c=i;c<=j;c++)
{
maxx=max(maxx,array[c]);
minn=min(minn,array[c]);
}
//1 寻找最小
while(j<array.size()&&array[j]<maxx)
{
minn=min(minn,array[j]);
j++;
}
//2 寻找最大,最小约束左边
while(i>-1&&array[i]>minn)
{
maxx=max(maxx,array[i]);
i--;
}
//3 最大约束右边
while(j<array.size()&&array[j]<maxx) j++;
ans[0]=i+1;
ans[1]=j-1;
return ans;
}
};