题目描述
对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。
给定一个整数数组A及它的大小n,请返回最短子数组的长度。
测试样例:
[1,5,3,4,2,6,7],7
返回:4
思路:应用sort方法,产生一个排序的数组作为参照,根据这个参照对比原来数组,如果对比一样,就向前(向后),只有一边不一样就,判断另一边,两边都不一样退出。
class ShortSubsequence {
public:
int findShortest(vector<int> A, int n) {
vector<int> B = A;
sort(B.begin(),B.end());
int left = 0; int right = n - 1;
while(left<=right){
if(A[left] == B[left] && A[right] == B[right]){
left++; right--;
}
else if(A[left]!=B[left] && A[right]!=B[right]) break;
else if(A[left]!=B[left &&A[right]==B[right]]){
right--;
}else{
left++;
}
}
if(right >=left) return right-left+1;
else
return 0;
}
};
未完善代码,通过百分之十,有兴趣的同学可以自己完善下,欢迎交流:
class ShortSubsequence {
bool ynSort(int n,int m,vector<int> A){
for(int i = n;i<m;i++)
for(int j = i+1 ; j<m;j++){
if(A[i]>A[j])
return true;
}
return false;
}
public:
int findShortest(vector<int> A, int n) {
int aSize = n;
int aArray[aSize][aSize];
int min = 65535;
bool mark = false;
for(int i = 0;i<aSize;i++)
for(int j = 0;j<aSize;j++)
aArray[i][j]=65535;
for(int i = 0;i<aSize;i++)
for(int j = i+1;j<aSize;j++)
if(ynSort(i,j,A)){
aArray[i][j]=j-i+1;
mark =true;
}
for(int i = 0;i<aSize;i++)
for(int j = 0;j<aSize;j++)
if(aArray[i][j] < min)
min = aArray[i][j];
if(mark)
return min;
else
return 0;
}
};