最长上升子序列优化(贪心+二分)(超级详细的讲解)

news2024/11/19 19:40:18

最长上升子序列优化(贪心+二分

  • 一、回顾
    • 1、问题描述
    • 2、动规代码弊端
  • 二、优化
    • 1、算法优化
    • 2、代码实现

一、回顾

1、问题描述

在这里插入图片描述

2、动规代码弊端

我们之前的动规代码的时间复杂度是 O ( n 2 ) O(n^2) O(n2)。如果大家还不知道动态规划的逻辑的话,建议大家先去看一下动态规划的解决思路:动态规划解决最长上升子序列

虽然动态规划的思路已经比DFS的做法快了很多,但是当数据量增大以后, O ( n 2 ) O(n^2) O(n2)的时间复杂度还是会超时的,那么我们能否进一步优化呢?

我们接着往下看。

二、优化

1、算法优化

我们先看下面的例子:
在这里插入图片描述
上述红色部分是最长上升子序列。

我们发现:

第一个元素 1 1 1,就是长度为 1 1 1的所有子序列中最小的最后一个元素

第二个元素 2 2 2,就是长度为 2 2 2的所有子序列中最小的最后一个元素

第三个元素 5 5 5,就是长度为 3 3 3的所有子序列中最小的最后一个元素

第四个元素 6 6 6,就是长度为 4 4 4的所有子序列中最小的最后一个元素

我们现在想一想,这是为什么呢?

我们长度为 ( l e n + 1 ) (len+1) (len+1)的子序列,是在长度为 ( l e n ) (len) (len)的子序列的基础上发展而来的。

而我的子序列能否边长,其实是取决于子序列的最后一位。

最后一位越小,我的子序列越容易变长。


我们可以简单证明一下:

假设我们的最长上升子序列的长度是 l e n len len,而该序列中的前 k k k个元素组成的子序列中( a [ k ] a[k] a[k]是这个子序列的最后一位), a [ k ] a[k] a[k]不是最小的那一位,即存在一个以 j j j为结尾的长度为 k k k的子序列(两个子序列只有最后一位不同),并且 j < a [ k ] j<a[k] j<a[k],同时这个序列并不是最终答案的一部分。

由于答案是严格单调增的序列,那么必定存在 a [ k − 1 ] < a [ k ] < a [ k + 1 ] a[k-1]<a[k]<a[k+1] a[k1]<a[k]<a[k+1],又因为两个长度为 k k k的子序列只有最后一位不同,所以必定满足 j > a [ k − 1 ] j>a[k-1] j>a[k1]

那么此时必定存在以下等式:

a [ k − 1 ] < j < a [ k ] < a [ k + 1 ] a[k-1]<j<a[k]<a[k+1] a[k1]<j<a[k]<a[k+1]

也就是说,我们可以将我们假想的 j j j插入到答案中,使得其长度变成 ( l e n + 1 ) (len+1) (len+1)。而我们假设最大就是 l e n len len,可是我们却推导出了一个比 l e n len len更大的上升子序列。所以产生了矛盾,假设不成立。


因此,我们得出结论:

最长上升子序列中的某一位 a [ i ] a[i] a[i],必定是长度为 i i i的子序列的最后一位中,最小的一个。

所以,我们维护这样一个数组 q [ i ] q[i] q[i]

这个数组记录的是子序列长度为 i i i的序列中,最后一位中最小的最后一位。如果我们碰到了一个 a [ i ] a[i] a[i]

同时,这个 a [ i ] a[i] a[i]满足 q [ k ] < a [ i ] < q [ k + 1 ] q[k]<a[i]<q[k+1] q[k]<a[i]<q[k+1]

此时,就说明这个 a [ i ] a[i] a[i]是可以接在长度为 k k k的子序列后面,从而让这个序列的长度变成 ( k + 1 ) (k+1) (k+1)

而此时的 a [ i ] < q [ k + 1 ] a[i]<q[k+1] a[i]<q[k+1],说明长度为 k + 1 k+1 k+1的子序列中,又出现了一个比原最小值更小的 a [ i ] a[i] a[i]

所以我们此时更新一下: q [ k + 1 ] = a [ i ] q[k+1]=a[i] q[k+1]=a[i]

于是目前的问题,就是我们遍历到一个数值的时候,我们要立刻找到 q [ k ] q[k] q[k] q [ k + 1 ] q[k+1] q[k+1]:

使得 q [ k ] < a [ i ] < q [ k + 1 ] q[k]<a[i]<q[k+1] q[k]<a[i]<q[k+1]

而经过我们刚才的分析,其实遍历过后,这个 q [ N ] q[N] q[N]数组就是我们的最长的上升子序列的具体内容,所以这个序列必定是升序的

而对于有序的序列,我们可以采用二分法来解决。

2、代码实现

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N],q[N];
int n;
int main()
{
    scanf("%d", &n);
    //读入数据
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    
    int len = 0;//记录长度
    
    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;
        }
        //如果该元素插在了末尾,说明r+1=len+1了。此时长度增加,我们更新len 
        len = max(len, r + 1);
        q[r + 1] = a[i];
    }
    printf("%d\n", len);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我国用电信息采集系统行业应用需求及市场容量分析 现6省上线运行

用户用电信息采集系统是通过对配电变压器和终端用户的用电数据的采集和分析&#xff0c;实现用电监控、推行阶梯定价、负荷管理、线损分析&#xff0c;最终达到自动抄表、错峰用电、用电检查&#xff08;防窃电&#xff09;、负荷预测和节约用电成本等目的。建立全面的用户用电…

VuePress初学之利用模板theme创建一个个人博客网站

目录前言官方文档创建项目创建目录安装VuePress初始化项目创建文档修改package.json运行项目修改README.md的编码显示官方默认主题创建.vuepress文件创建config.js修改README.md补充logo资源运行效果更多默认主题配置开源主题vuepress-theme-reco安装脚手架初始化项目安装npm运…

为什么说L2毫秒接口的应用比较广泛?

和其它的数据接口一样&#xff0c;这L2毫秒接口也起到了一个媒介的作用&#xff0c;将所有的股票信息都传递到了另外一个软件上。因为市场上的股票种类很多&#xff0c;所以每一种股票都具有其特有的信息&#xff0c;是进行股票买卖的基础。 为什么说L2毫秒接口的应用比较广泛…

MCU-51:矩阵键盘

题目一、矩阵键盘介绍1.1 矩阵键盘1.2 扫描的概念二、编程2.1 LCD屏显示“HelloWord”2.2 矩阵键盘程序三、矩阵键盘应用一、矩阵键盘介绍 1.1 矩阵键盘 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式 采用逐行或逐列的“扫描…

Flowable学习笔记(一):SpringBoot项目整合Flowable

1.基于k8s部署Mysql 参考&#xff1a;k8s部署mysql 我安装是去掉了卷挂载。安装过程可能出现磁盘容量不够&#xff0c;可以通过df -h查看。 镜像下载得比较慢&#xff0c;可以先用docker拉取镜像。 2.搭建SpringBoot项目 (1)搭建maven项目&#xff0c;pom.xml依赖如下&am…

一文带你深入理解【Java基础】· 网络编程(下)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

我国农村水利水电行业项目投资、水电站建设及装机容量情况分析

一、农村水利水电行业投资情况 根据水利部数据显示&#xff0c;2020年农村水利水电累计下达投资428.63亿元&#xff08;其中中央投资214.84亿元&#xff0c;地方投资213.79亿元&#xff09;。其中&#xff0c;中央预算内投资97.75亿元&#xff0c;中央财政水利发展资金100.96亿…

【MindStudio训练营第一季】基于U-Net网络的图像分割的MindStudio实践

前情说明 本作业基于Windows版MindStudio 5.0.RC3&#xff0c;远程连接ECS服务器使用&#xff0c;ECS是基于官方分享的CANN6.0.RC1_MindX_Vision3.0.RC3镜像创建的。 基于ECS&#xff08;Ascend310&#xff09;的U-Net网络的图像分割 1. U-Net网络介绍&#xff1a; U-Net模…

第12章_数据库其它调优策略

第12章_数据库其它调优策略 1.数据库调优的措施 1.1调优的目标 尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务。(吞吐量更大)。合理的结构设计和参数调整&#xff0c;以提高用户操作响应的速度。(响应速度更快)减少系统的瓶颈&#xff0c;提高MySQL数据库整…

PCL 基于最小生成树(MST)获取单木骨架(粗)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 提取的过程大体上分为两个部分:生成单木MST(最小生成树)以及基于该MST获取大致的骨架结构(线条)。 具体的计算过程如下所述: 1、首先应用Delaunay三角剖分来构造初始图。Delaunay三角剖分是MST计算的基础,因…

【SQL优化】union 与 union all 的区别

先说结论&#xff1a; union all:合并查询结果 union:合并查询结果 && 去重 && 排序 &#xff08;所以 union 比union all 功能多&#xff0c;性能就会稍微差一点&#xff09; 推导过程&#xff1a; 假设有这样一张表&#xff0c;里面有4条数据 union操作…

win环境mysql版本升级到5.7过程

win环境mysql版本升级到5.7过程&#xff0c;我win电脑里mysql版本是5.0&#xff0c;版本太老了&#xff0c;也不支持和nacos集成&#xff08;nacos至少需要5.6版本的mysql&#xff09;&#xff0c;思来想去还是要升级一下自己电脑的mysql版本&#xff0c;保守点升级到5.7吧&…

Apache Hive DML语句与函数使用

Hive SQL 加载数据 之前我们加载数据是&#xff0c;创建一张表&#xff0c;将结构化文件放到hadoop对应表路径下。这样我们就将表和文件进行映射了。但是这样比较暴力&#xff0c;官方不推荐。 这样的操作是直接跳过了Hive Load加载数据 语法&#xff1a; load data [local]…

【编译原理】实验一:熟悉实验环境VSCode并完成正则表达式转换为NFA

目录 实验一 熟悉实验环境VSCode并完成正则表达式转换为NFA 一、实验目的 二、预备知识 三、实验内容 VSCode的基本使用方法 安装和启动VSCode VSCode的窗口布局 使用VSCode将项目克隆到本地磁盘 使用VSCode登录平台 查看项目中的文件 实验源代码 演示程序的执行过程 四、实验过…

我国淡水养殖虾行业现状:小龙虾一路高歌猛进 青虾产量逐渐下滑

虾是一种生活在水中的节肢动物&#xff0c;属节肢动物甲壳类&#xff0c;种类很多&#xff0c;包括南极红虾、青虾、河虾、草虾、对虾、明虾、龙虾等。按出产来源不同&#xff0c;虾分为海水虾和淡水虾两种。 虾类养殖是以经济价值较高的虾类为对象&#xff0c;进行人工饲养生产…

houdini之旋转 revolve

话不多说&#xff0c;先上效果图 一根曲线绕指定轴旋转一周形成扫描面 有两组参数一个是旋转过程设置&#xff08;revolve&#xff09;一个是旋转结果设置(detail) 一、revolve Connectivity&#xff1a;如何构建几何体 origin&#xff1a;旋转轴原点 direction&#xff1a;…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.10 圆弧、饼图

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1AA411R75N 本节讲解如何绘制圆弧、饼图、弦图 1. 相关的 API 直接查看官方的帮助文档&#xff0c;可以看到有多个重载的方法 1.1 圆弧 绘制圆弧时&#xff0c;需要指定一个矩形&#xff0c;…

基于WOA优化的svm最优参数计算仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 WOA算法设计的既精妙又富有特色&#xff0c;它源于对自然界中座头鲸群体狩猎行为的模拟&#xff0c; 通过鲸鱼群体搜索、包围、追捕和攻击猎物等过程实现优时化搜索的目的。在原始的WOA中&#x…

数据挖掘期末-图注意力模型

PyGAT图注意力模型 ​  PyGAT实现的分类器&#xff1a; https://www.aliyundrive.com/s/vfK8ndntpyc 还在发烧&#xff0c;不是特别清醒&#xff0c;就简单写了写。用GAT进行关系预测&#xff0c;GAT可能是只做中间层&#xff0c;不过本来在GAT这一层就为了能懂就简化了很多…

基于双闭环PID控制器的永磁同步电机控制系统仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 永磁同步电机&#xff08;PMSM&#xff0c;permanent magnet synchronous motor&#xff09;的基本结构主要包括定子、转子以及端盖三个主要模块。其中转子磁路结构是永磁同步电机与其它电机最主…