动态规划------最长递增子序列

 

 

时间复杂度: O(NlogN)

class AscentSequence {
public:
    int findLongest(vector<int> A, int n) {
        //B数组,是存储对应长度i的LIS的最小末尾
        vector<int> B;
        B.push_back(A[0]);
        for(int i=1;i<n;i++){
            if(A[i]>B.back()){
                B.push_back(A[i]);
                continue;
            } 
            else 
                B[findPos( B , A[i])]= A[i];
        }
        return B.size();
    }
    //找到B中第一个比A[i]大的数的位置,二分法 O(logN)
private:
    int findPos(vector<int> B ,int num)
    {
        int left=0,right=B.size();
        while(left<right){
            int mid=left+(right-left)/2;
            if(B[mid]>num) right=mid;//!!!!!!!!!
            else if(B[mid]<num) left=mid+1;
            else return mid;
        }
        
        return left;
    }
};

时间复杂度 O(N^2)

class AscentSequence {
public:
    int findLongest(vector<int> A, int n) {
        // write code here
 
        vector<int> tmp(n,1);
        for(int i=0;i<n;++i){
            
            for(int j=0;j<=i;++j){
                if(A[i]>A[j] && tmp[i]<tmp[j]+1)
                    tmp[i]=tmp[j]+1;
            }
         }
        int tmax=tmp[0];
        for(int i=0;i<n;i++){
            tmax=max(tmp[i],tmax);
        }
        return tmax;
    
};

  

posted @ 2018-05-14 21:30  东风知我欲山行  阅读(124)  评论(0编辑  收藏  举报