对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。
给定一个int数组A和数组的大小n,请返回一个整型,代表所求序列的长度。保证A中元素均为正整数。
我们需要确定最短子数组,也就是说我们需要找到需要排序的数字,同时排除应该站在原地的数字。
首先从前往后遍历,不断记录下遍历的最大值,当之后的数字比他小时,记录位置,我们需要记录下最右的位置,也就是说这个数必定是在这个记录位置的之后。之后我们从后往前遍历,不断记录遍历的最小值,当之后的数字比他大时,记录位置,我们需要记录下最左的位置,也就是说这个数必定在这个记录位置之前。两个位置之间的数字就是需要排序的最短子序列。代码如下
class Subsequence {
public:
int shortestSubsequence(vector<int> A, int n) {
// write code here
int left=0,right=0,temp=A[0],i;
for(i=0;i<n;i++){
if(temp<=A[i]){ //记录下最大值
temp=A[i];
}
else{ //当后面的数字比最大值小时,记录位置
left=i;
}
}
temp=A[n-1];
for(i=n-1;i>=0;i--){
if(temp>=A[i]) temp=A[i]; //记录下最小值
else right=i; //当后面位置比最小值大时,记录位置
}
if(left==right) return 0;
return left-right+1;
}
};