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

最长上升子序列 II

时间:2023-03-31 18:56:19浏览次数:47  
标签:10 int 复杂度 mid len II 序列 最长

最长上升子序列 II

题目描述

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数 N。

第二行包含 N 个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1 ≤ N ≤100000
-10^9 ≤ 数列中的数 ≤ 10^9

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4


算法1

(DP) O(n^2)

动态规划状态转移

时间复杂度

O(n^2),数据范围10^5会TLE

空间复杂度

dont know

C++ 代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n;
int a[N];
int f[N];

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);

    a[0] = - 1e9;
    for(int i = 1; i <= n; i ++)
        for(int j = 0; j < i; j ++)
            if(a[j] < a[i])
                f[i] = max(f[i], f[j] + 1);
    int res = -1;
    for(int i = 1; i <= n; i ++) res = max(res, f[i]);

    cout << res;

    return 0;
}

算法2

(利用单调栈的思路优化) O(nlogn)

贪心思路:较小的数作为的子序列结尾 比 较大的数子序列的结尾 更好
q[i]存的是长度为i的上升子序列的第i位的值。
枚举时查看当前元素a[i]能够插入到哪个子序列的末尾,根据贪心想法插入的一定是子序列结尾元素q[i]严格小于当前元素a[i]的子序列。

时间复杂度

二分logn,枚举n 时间复杂度nlogn

空间复杂度

dont know

C++ 代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int a[N], q[N];
int f[N];

int main()
{
    cin >> n;
    for(int i = 0; i < n; i ++) cin >> 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;
        }
        len = max(len, r + 1);
        q[r + 1] = a[i];
    }
    
    cout << len;
    return 0;
}

标签:10,int,复杂度,mid,len,II,序列,最长
From: https://www.cnblogs.com/bothgone/p/17277210.html

相关文章

  • 开心档之MySQL 序列使用
    MySQL序列使用MySQL序列是一组整数:1,2,3,...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的序列。使用AUTO_INCREMENTMySQL中最简单使用序列的方法就是使用MySQLAUTO_INCREMEN......
  • day8| 344.反转字符串;541.反转字符串II;剑指offer 05.替换空格;151.翻转字符串里的单词
    344.反转字符串 题目简述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组,使用O(1)的额外空间解决这一问题。 解题思路:没什么好说的,直接双指针 代码如下:classSolution:de......
  • day31 打卡455.分发饼干 376. 摆动序列 53. 最大子数组和
    day31打卡455.分发饼干376.摆动序列53.最大子数组和455.分发饼干455题目链接classSolution{publicintfindContentChildren(int[]g,int[]s){intcount=0;Arrays.sort(g);Arrays.sort(s);intgIndex=0;ints......
  • 代码随想录day 31 455.分发饼干 | 376. 摆动序列 | 53. 最大子序和
    455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j] 。如果s[j] >=g[i],我们可以将这个饼干j分配给孩子i,这个孩......
  • 利用Jackson序列化实现数据脱敏
    作者:京东物流张晓旭1.背景在项目中有些敏感信息不能直接展示,比如客户手机号、身份证、车牌号等信息,展示时均需要进行数据脱敏,防止泄露客户隐私。脱敏即是对数据的部分信息用脱敏符号(*)处理。2.目标在服务端返回数据时,利用Jackson序列化完成数据脱敏,达到对敏感信息脱敏展示。降低重......
  • 848. 有向图的拓扑序列
    https://www.acwing.com/problem/content/850/#include<bits/stdc++.h>usingnamespacestd;constintN=100010;vector<int>p[N];//vector变长数组来写邻接表queue<int>q;//队列操作intd[N];//统计入度intn,m,cnt,ans[N];//ans数组记......
  • LG推旗舰智能机D1L 抗衡三星Galaxy S III
    据外媒DigitalDaily报道,韩国LG公司即将发布一款旗舰智能手机,设备代号命名为D1L,以此抗衡三星即将到来的新一代GalaxySIII。该设备将配有4.7英寸大屏幕,1280*720像素分辨率......
  • 走过最长的路是ChatGPT的套路,信过最真的话是Adobe的Firefly
    在人工智能爆火的当下,去讨论以ChatGPT为首的人工智能的优劣,容易引起上纲上线的麻烦。所以在开始之前我们先说好,今天不聊主义聊生活;不聊抽象聊具体;不聊结构聊个体,这是大前提......
  • day29 打卡491.递增子序列 46.全排列 47.全排列 II
    day29打卡491.递增子序列46.全排列47.全排列II491.递增子序列491题目链接classSolution{List<List<Integer>>result=newArrayList<>();LinkedList<......
  • 272. 最长公共上升子序列
    题目描述给两个数组,求数组的公共最长上升子序列?f1LCS+LIS+3重循环基本分析状态定义的线索?(1)需要包含两个数组;(2)需要考虑到上升的限制;状态集合?f[i][j]表示a中以前i......