首页 > 其他分享 >最大上升子序列 II

最大上升子序列 II

时间:2024-09-04 19:04:17浏览次数:3  
标签:结尾 int mid II 序列 长度 上升

序列:可以不连续,但与原数列当中出现的先后顺序要相同;

上升子序列: 需要满足单调性 - 单调递增


算法1

(贪心+二分) O(nlogn)

时间复杂度

二分查找一个数的最小的最大值 O(logn);

一共有 n 个数进行二分 O(nlogn);

贪心

分析样例:

7
3 1 2 1 8 5 6

1.首先分析长度为1的上升子序列 —— 3 , 1

我们可以发现能接到 3 后面的数,肯定能接到1的后面,由于 3 > 1 ;

因此长度为 1 的上升子序列的结尾数最小值为 1 - min(3,1);

2.用一个数组q[] ,来存放不同长度下上升子序列中的结尾数的最小值

q[1] : 长度为 1 的上升子序列的最小的结尾数,即为 1
q[2] : 长度为 2 的上升子序列的最小的结尾数,即为 2
q[3] : 5
q[4] : 6

因此最大上升子序列的长度为 4;(q数组中元素的个数)

规律:
随着长度的增加,结尾值一定时严格单调递增的;

也就是说,长度越长,结尾元素的最小值越大

问题:

如何找以a[i] 结尾的最大上升子序列的长度?

关键点:

对于a[i]而言,它可以接到所有比它小的末尾上;

从这一点,我们可以把a[i]接到最大的小于a[i]的结尾后面

如,比 a[i] 小的最大值为q[4]上存放的值, 即长度为4的上升子序列对应的结尾值;

说明q[4] < a[i]的,那么可以把 a[i] 接到长度为4的上升子序列上,接完之后上升子序列的长度就变成了5

这里我们可以更新长度为5的值为 a[i];

如果存在长度为5的上升子序列的结尾值,则覆盖掉原来的结尾值;

如果不存在,那么就是a[i];

为何q[5] 一定大于等于 a[i]呢?

因为q[4]是比a[i] 小的最大值,因此q[5] 肯定比a[i] 大;

二分

求最大的最小,最小的最大值时用二分

由于本题是求最小的最大值, 右向逼近

用这套板子

   while(l < r)
   {
       int mid = l + r + 1 >> 1;
       
       if(check()) l = mid;
       else r = mid - 1;
   }

C++ 代码

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;

int n;
int a[N];
int q[N];

int main(){
    scanf("%d",&n);
    for(int i = 0; i < n ; i++){
        scanf("%d",&a[i]);
    }
    
    int len = 0;  
    q[0] = - 2e9;    //至于这一部分没太理解 - 后续更新
    
    for(int i = 0; i <= n; i++){
        int l = 0, r = len;
        while(l < r){
            int mid = l + r + 1 >> 1;
            if(q[mid] < a[i]) l = mid;
            else r = mid - 1;
        }
        len = max(len,r + 1);
        q[r + 1] = a[i];
    }
    printf("%d",len);
    return 0;
}

标签:结尾,int,mid,II,序列,长度,上升
From: https://www.cnblogs.com/ltphy-/p/18397190

相关文章

  • IIS相关错误报错汇总整理及解决方案
    解决方案400BadRequest:检查请求是否包含错误的信息或格式。401Unauthorized:确认是否已经进行了身份验证。403Forbidden:检查是否有足够的权限访问资源。404NotFound:确认请求的URL是否正确,资源是否存在。500InternalServerError:检查服务器日志,寻找错误信息。503Ser......
  • java 二次反序列化
    java二次反序列化SignedObject该类是java.security下一个用于创建真实运行时对象的类,更具体地说,SignedObject包含另一个Serializable对象。先看其构造函数方法。看到参数接受一个可序列化的对象,然后又进行了一次序列化,继续看到该类的getObject方法(这是个getter方法......
  • Java毕设项目II基于SSM的文学网的设计与实现
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着互联网技术的蓬勃发展,数字化阅读已成......
  • Java毕设项目II基于SSM的校园自助洗衣系统的设计与实现
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着互联网技术的飞速发展和普及,信息管理......
  • NOIP2024集训Day20 DP常见模型1 - 序列
    NOIP2024集训Day20DP常见模型1-序列A.[JOI2022Final]Let'sWintheElection贪心+DP。首先,一定是所有协作者同时在同一个州演讲,这样才最优。然后,假设我们已经知道所有州的方案(支持、支持+协作、反对),那我们一定是先按照从小到大的顺序拿下所有“支持+协作”州,这样最优。......
  • 【漏洞复现】通达OA v11.7 moare 反序列化漏洞
    免责声明:        本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规......
  • LSTM+transformer+稀疏注意力机制(ASSA)时间序列预测(pytorch框架)
    LSTM+transformer+稀疏注意力机制transformer,LSTM,ASSA注意力首发原创!纯个人手打代码,自己研究的创新点,超级新。可以发刊,先发先的,高精度代码。需知:好的创新性模型可以事半功倍。目前太多流水paper,都是旧模型,老师已经审美疲劳,很难发好一点的刊,这种模型很新,让paper审核老师眼......
  • SSA(麻雀优化算法)+CNN+LSTM时间序列预测算法(python代码)
    1.SSA(SparrowSearchAlgorithm)简介:SSA是一种新兴的群体智能优化算法,模拟麻雀觅食行为。麻雀群体中的“发现者”负责寻找食物,并将信息传递给“追随者”,后者根据这一信息进行觅食。SSA通过这种合作机制寻找最优解。SSA在优化问题中可以视为一种元启发式算法,擅长在复杂搜索......
  • 高创新 | Matlab实现Transformer-GRU-SVM多变量时间序列预测
    高创新|Matlab实现Transformer-GRU-SVM多变量时间序列预测目录高创新|Matlab实现Transformer-GRU-SVM多变量时间序列预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现Transformer-GRU-SVM多变量时间序列预测,Transformer+门控循环单......
  • 代码随想录算法训练营,9月3日 | 454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和
    454.四数相加II题目链接:454.四数相加II文档讲解︰代码随想录(programmercarl.com)视频讲解︰四数相加II日期:2024-09-03想法:4个数组,两两分开遍历时间复杂度低点,用一个map,key是i+j的值,value是出现次数,对nums3、4只需要判断0-k-l在不在map里,最后依次加上出现次数就行了。Java代......