最长递增子序列

https://www.nowcoder.com/practice/30fb9b3cab9742ecae9acda1c75bf927tpId=101&tqId=33093&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

题目描述

给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)

输入描述:

输出两行,第一行包括一个正整数n(n<=100000),代表数组长度。第二行包括n个整数,代表数组arr(1≤arr[i​]≤1e9)。

输出描述:

输出一行。代表你求出的最长的递增子序列。

示例1

输入

9
2 1 5 3 6 4 8 9 7

输出

1 3 4 8 9

示例2

输入

5
1 2 8 6 4

输出

1 2 4

说明

其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个字典序最小,故答案为(1,2,4)

备注:

时间复杂度O(nlogn),空间复杂度O(n)。
#include
using namespace std;
int main(){
    int n;
    cin>>n;
    vector arr(n);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    for(int i=0;i>arr[i];//scanf("%d",&arr[i]);
    }
    vector dp(n);
    vector ends(n);
    dp[0]=1;
    ends[0]=arr[0];
    int right=0;
    int le=0,ri=0,mid=0;
    
    for(int i=1;iends[mid]){
                le=mid+1;
            }else{
                ri=mid-1;
            }
        }
        right=max(right,le);
        ends[le]=arr[i];
        dp[i]=le+1;*/
        
        //以上while()二分查找可以使用库函数lower_bound实现
        //vector::iterator it;
        auto it=lower_bound (ends.begin(),ends.begin()+right+1,arr[i]); //[beign,last)
        right=max(right,int(it-ends.begin()));
        *it=arr[i]; //ends[it-ends.begin()]=arr[i];
        dp[i] = int(it - ends.begin()) + 1;
    }
    
    int len=0;
    int index=0;
    for(int i=0;ilen){
            len=dp[i];
            index=i;
        }else if(dp[i]==len && arr[i] res(len,0);
    res[--len]=arr[index];
    for(int i=index-1;i>=0;i--){
        if(dp[i]==dp[index]-1 && arr[i]

 

你可能感兴趣的:(牛客,面试指南,dp)