最长递增子序列 nlogn

本文介绍了一种寻找最长递增子序列的高效算法,采用动态规划思想,并结合二分查找来实现O(NlogN)的时间复杂度。通过具体代码示例展示了如何实现该算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>

using namespace std;

//2 1 5 3 6 4 8 9 7

//上课讲了这个,回去之后就用代码实现以下

// 这个算法的目标是 找到一个最长的递增子序列

//O(NlogN)的复杂度

//思路是遇到小的就留下,更新的路程中 插入到这个序列当中

//一开始看那个麻瓜blog理解错了

//然后看这个理解了动态规划里的算法,没看懂意思

//http://www.360doc.com/content/16/0427/06/478627_554122487.shtml

//再回到麻瓜blog之后 了解意思了 准备coding一下


//二分查最大的比它小的位置。

int binary_find(int tar,int l,int r,int* a){

    if(l==r)

        return l;

    int mid=(l+r)/2;

    //这个符号该怎么定义呢

    if(tar<a[mid])

        return binary_find(tar,l,mid,a);

    else

        return binary_find(tar, mid+1, r, a);

}


int* getlist(int *a){

    

    int* temp=new int[9];

    int len=0;

    //temp[0]=0;

    for (int i=1;i<9;i++){

        if(a[i]<a[temp[len]])

            temp[binary_find(a[i], 0, len, a)]=i;

        else{

            len++;

            temp[len]=i;

            

        }

    }

    

    for(int i=0;i<len+1;i++){

        temp[i]=a[temp[i]];

       

    }

   //len=5;

    //cout

    int *out=new int[len];

    //len--;

    out[len]=a[temp[len]];

   

    cout<<"thresh"<<out[len]<<endl;

    

    for(int i=temp[len];i>-1;i--){

        cout<<"len:"<<len<<endl;

        //cout<<out[len];

        if(a[i]<out[len]){

            out[len-1]=a[i];

            len--;

            cout<<out[len]<<endl;

        }

    }

    

    //2 1 5 3 6 4 8 9 7

    

    return out;

   

    

}

                    

                


                    

int main(){

    

    int a[9]={2,1,5,3,6,4,8,9,7};

    int *b=getlist(a);

    for(int i=0;i<5;i++)

        cout<<b[i]<<" ";

        cout<<endl;

    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值