第一种算法,很笨,根据序列大部分有序,中间无序的性质,把序列进行排序,然后一 一对应,就能找到从哪里开始
代码如下:
int findUnsortedSubarray(vector<int>& nums) {
vector<int> num1;
for(int i=0;i<nums.size();i++)
num1.push_back(nums[i]);
sort(num1.begin(),num1.end());
int i,j;
for(i=0;i<nums.size();i++)
if(nums[i]!=num1[i])
break;
for(j=num1.size()-1;j>=0;j--)
if(nums[j]!=num1[j])
break;
if(i==nums.size())
return 0;
return j-i+1;
}
第二种方法,先找到无序部分的最大,最小值,然后在原序列中进行比较。//一定要利用本身的性质啊,别傻傻暴力,改变思路
int findUnsortedSubarray(vector<int>& nums) {
int max=INT_MIN,min=INT_MAX;
bool flag=false;
for(int i=1;i<nums.size();i++)
{
if(nums[i]<nums[i-1])
flag=true;
if(flag==true)
min=(nums[i]<min)?nums[i]:min; //找失序序列中最大的
}
if(!flag)
return 0;
flag=false;
for(int i=nums.size()-2;i>=0;i--)
{
if(nums[i]>nums[i+1])
flag=true;
if(flag==true)
max=(nums[i]>max)?nums[i]:max; //找失序部分序列中最小的元素
}
int r=nums.size()-1,l=0;
for(l;l<nums.size();l++) //分别找下界和上界
if(nums[l]>min)
break;
for(r;r>=0;r--)
if(nums[r]<max)
break;
return r-l+1;
}