最长递增自学列

84 阅读1分钟

www.nowcoder.com/practice/9c…

不说别的了,自己太废了,啥都不想学,也不会写,这个是在网上搜到的教程

class Solution {
public:
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型vector the array
     * @return int整型vector
     */

    vector<int> LIS(vector<int>& arr) {
        // write code here
        vector<int> dp,len;
        if(arr.empty()) return dp;

        const int inf = 1e9+10;
        dp.push_back(inf);

        int mx=0;
        for(int i=0;i<arr.size();i++) {
            if(arr[i]>dp.back()) {
                dp.push_back(arr[i]);
                len.push_back(dp.size());
            } else if(arr[i]==dp.back()) {
                len.push_back(dp.size());
            }
            else if(arr[i]<=dp[0]) {
                dp[0]=arr[i];
                len.push_back(1);
            }
            else {
                int l=0,r=dp.size(),ack=l;
                while(l<r) {
                    int mid = (l+r)>>1;
                    if(dp[mid]>=arr[i]) r=mid;
                    else l=mid+1,ack=mid;
                }
                dp[ack+1]=arr[i];
                len.push_back(ack+2);
            }
            mx = max(mx,len.back());
        }
        vector<int> result(mx);
        for(int i=arr.size()-1,j=mx;j>0;i--) {
            if(len[i]==j) {
                result[--j]=arr[i];
            }
        }
        return result;

    }
};