最大上升子序列--LIS

最大上升子序列

思路:

建立一个low数组,用于存放上升的子序列,并记录长度,如果一个数大于low的最后一个数,则将他添加到low数组最后面,如果不大于,则将那个数利用二分放在low合适的位置,以便下次比较。

时间复杂度O(nlogn)

Code:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e6+5;
int n,len;//n为a数组的长度,len为low数组的长度
int a[N],low[N];
int find(int x)
{
    int l=1,r=len;
    while(l<=r)//二分查找
    {
        int mid=(l+r)>>1;
        if(x>=low[mid]) l=mid+1;
        else r=mid-1;
    }
    return l;
}
void lis()
{
    low[1]=a[1];//默认第一个数是上升的
    len=1;//此时low的长度为1
    for(int i=2;i<=n;i++)
    {
        if(a[i]>low[len])//判断当前数是不是大于low数组中最后的数 
        {
            low[++len]=a[i];//如果大于,则将他添加到low数组中 长度自增1
        }
        else
        {
            low[find(a[i])]=a[i];//如果小于 则更新low数组
        }
    }    
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        low[i]=989898;//给low数组赋最大值
    }
    lis();
    cout<<len<<endl;
    return 0;
}
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
4344次浏览 34人参与
# 你的实习产出是真实的还是包装的? #
1041次浏览 27人参与
# MiniMax求职进展汇总 #
22759次浏览 292人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6842次浏览 35人参与
# 简历第一个项目做什么 #
31227次浏览 312人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186301次浏览 1113人参与
# 巨人网络春招 #
11132次浏览 221人参与
# 面试紧张时你会有什么表现? #
30312次浏览 188人参与
# 简历中的项目经历要怎么写? #
309297次浏览 4146人参与
# 网易游戏笔试 #
6300次浏览 83人参与
# 职能管理面试记录 #
10674次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6809次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56693次浏览 357人参与
# 腾讯音乐求职进展汇总 #
160376次浏览 1105人参与
# 小红书求职进展汇总 #
226831次浏览 1356人参与
# AI时代,哪些岗位最容易被淘汰 #
62254次浏览 723人参与
# 你怎么看待AI面试 #
179196次浏览 1160人参与
# 正在春招的你,也参与了去年秋招吗? #
362437次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92119次浏览 896人参与
# 机械求职避坑tips #
94392次浏览 567人参与
# 校招笔试 #
465713次浏览 2948人参与
# 面试官最爱问的 AI 问题是...... #
27023次浏览 833人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务