最短排序数组(动态规划)

来源:互联网 发布:比特精灵软件下载 编辑:程序博客网 时间:2024/06/03 14:52

题目描述
对于一个无序数组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;    }};