最长上升子序列

最长上升子序列 (LIS) 详解+例题模板 (全) 欢迎访问https://blog.youkuaiyun.com/lxt_Lucia~~ 宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~~ ------------------------------------我只是一条可爱哒分界线-------------------------------------- 1.摘要: 关... 阅读详情

题目描述

给定一个无序的整数数组,找到其中最长上升子序列的长度。

样例

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

题解

方法1:

  • 遍历数组中的每一个元素,dp[i]存储以第i个元素作为子序列的最后一个字符时,0~i中最大递增的子序列的长度
  • 在0~i中,任何小于nums[i]的元素都可以作为子序列倒数第二个位置上的数,选择一个使该数结尾可以使最终递增子序列长度最大的元素 dp[i]=max{dp[j]+1,(0≤j<i,nums[j]<nums[i])}
  • 如果0~i中没有一个数小于nums[i],那么dp[i]=1,说明以nums[i]结尾的递增子序列只有它本身
  • 该方法的时间复杂度为O(N2)
public int lengthOfLIS(int[] nums) {
        if(nums==null||nums.length==0)
        	return 0;
        int max=0;
        //dp[i]表示在以nums[i]结尾的情况下,0~i范围中最长递增的子序列的长度
        //在0~i中任何小于nums[i]的数都可以作为倒数第二个数,目标应该是选择一个使其以i结尾的递增子序列长度最长
        int dp[]=new int[nums.length];
        for(int i=0;i<nums.length;i++) {
        	dp[i]=1;
        	for(int j=0;j<i;j++) {
        		if(nums[i]>nums[j])
        			dp[i]=Math.max(dp[i], dp[j]+1);
        	}
        	max=Math.max(max, dp[i]);
        }
        return max;
    }

方法2:

  • 声明一个长度为N的数组end,end[i]存储了在所有长度为i+1的递增子序列中,最小结尾的数,初始end[0]=nums[0]
  • 变量right表示end的有效区域边界,在遍历元素的过程中,判断end的有效区域中是否存在一个元素大于num[i],若存在则更新该位置的值,置为nums[i],因为要保存每个长度下最小结尾的数;若不存在则有效区域向右扩一个位置,即递增子序列的长度+1;
  • 在end的有效区域中查找时采用二分查找,因为有效区域中的元素均是递增排列的。
  • 所以该方法的时间复杂为O(NlogN)
  • 最终最大递增子序列的长度记为right+1
//end[i]存储了在所有长度为i+1的递增子序列中,最小的结尾的数
	//当遍历第i个元素时在end的有效区内查找(使用二分查找的方式),是否存在一个元素大于等于nums[i]
	//若不存在则有效区向右扩一个,即递增子序列的长度也加1
	public int lengthOfLIS1(int[] nums) {
		if(nums==null||nums.length==0)
			return 0;
		int[]end=new int[nums.length];
		end[0]=nums[0];
		int right=0;
		for(int i=1;i<nums.length;i++) {
			int l=0,r=right;
			while(l<=r) {
				int mid=l+(r-l)/2;
				if(nums[i]>end[mid])
					l=mid+1;
				else
					r=mid-1;
			}
			right=Math.max(right, l);
			end[l]=nums[i];
		}
		return right+1;
	}
最长上升子序列问题(LIS问题)与最长不上升子序列问题的四种方法(c++ 模板代码) LIS问题与 L不IS问题 的模板代码,四种方法,动态规划,树状数组,线段树,二分查找 阅读详情

相关推荐

3.最长升序子序列 (动态规划)

3.最长升序子序列(动态规划)

李洙赫的博客 761

最长上升子序列(LIS)算法

LIS定义 LIS(Longest Increasing Subsequence)最长上升子序列  一个数的序列bi,当b1 &lt; b2 &lt; … &lt; bS的时候,我们称这个序列是上升的。 对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK), 这里1 &lt;= i1 &lt; i2 &lt; … &lt; iK ...

紫芝的博客 2万+

C语言——最长上升子序列

最长上升子序列 最长上升子序列 一个数的序列 bi,当 b1<b2<...<bS 的时候,我们称这个序列是上升的。对于给定的一个 序列(a1,a2,...,aN), 我们可以得到一些上升的子序列(ai1,ai2,...,aiK),这里 1<=i1<i2<...<iK <=N。比如,对于序列(1,7,3,5,9,4,8),有它的一些 上升子序列,如(1...

qq_43499793的博客 5933

【序列dp】最长上升子序列(一)

登山的变体,求整个队列个数-max(每个点的最大上升序列+最大下降序列-1)但是有的区间为空,当a[k] >= a[i]时,即不满足上升子序列。计算时:a[i]=Math.max(满足条件的a[k])集合表示:所有以a[i]结尾的最长上升子序列。LIS的双向求解,主要掌握求最长下降序列,即。考虑如何计算,一般考虑最后一个点,可以取。空,a[0],a[1],…属性为Max即长度的最大值。

Trae1ounG的博客 742

【LeetCode】300. 最长上升子序列:给定一个无序的整数数组,找到其中最长上升子序列的长度

【LeetCode】300. 最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。 进阶: 你能将算法的时间复杂度降低到 O(...

weixin_42956047的博客 3753

图解动态规划:最长上升子序列

最长上升子序列(300) 在上一篇中,我们了解了什么是DP(动态规划),并且通过DP中的经典问题 “最大子序和”,学习了状态转移方程应该如何定义。在本节中,我们将沿用之前的分析方法,通过一道例题,进一步巩固之前的内容! 01、题目分析 第300题:最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种

Google大神 1808

C++动态规划之最长上升子序列

从图1中可以看出,在遍历素组中的元素时,如果该元素的值大于该元素之前的元素值时,就有可能构成上升子序列,此时需要找到之前元素对应的最长子序列的长度,找到这些长度的最大值,并且对该最大值加1,即为当前元素对应的最长子序列。例如序列A={1,3,5,4,2},删除其中的第3项和第5项,得到序列B={1,3,4},删除其中的第3项和第4项,得到序列C={1,3,2},此时序列B和C是序列A的子序列。例如,序列D={1,5},是序列A的上升子序列,但不是最长上升子序列,而序列B是A的最长上升子序列。

hou09tian的博客 8262

磁盘I/O %util特别高

磁盘I/O %util特别高

eagle89的专栏 3088

最长上升子序列(c++图文详解)

这题思路是这样,假设这个序列长度为n,存在数组a中,maxlen[i]表示以第i个数为终点的最长上升子序列的长度,它被初始化为1,因为一开始单个字符的最长上升子序列都是1(它自己),我们先用一个循环i遍历这个序列,i从2(序列的第2个字符)开始一直加1加到n,表示求以第i个数为终点的最长上升子序列的长度,然后同时在这个循环下再来一个循环j,j从1开始加1一直加到i-1为止,表示以第j个数为终点的最长上升子序列。只要出现a[i]>a[j]的情况,maxlen[i]=max(maxlen[i],max..

qq_53763705的博客 7637

发那科机器人弧焊指令实战:从Search指令到组掩码设置的完整避坑指南

本文详细解析了发那科机器人弧焊指令系统的实战应用,从Search指令的正确使用到组掩码设置的避坑技巧。通过实际案例和参数优化建议,帮助工程师提升焊接质量和生产效率,避免常见错误操作。特别针对T2模式示教难题和外部轴协调运动提供了专业解决方案。

weixin_29040367的博客 184

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4974

Python最长上升子序列

最长上升子序列(百炼2757) 问题描述: 一个数的序列ai,当a1 < a2 < … < aS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8), 有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列

Hanger 2662

SuperPoint + LightGlue实战:低纹理墙面重建保姆级教程(附完整代码)

本文提供了一份针对低纹理墙面三维重建的实战教程。通过详细解析SuperPoint与LightGlue的核心参数调优,指导读者如何有效提取并匹配低纹理目标的特征点,并结合COLMAP完成从稀疏到稠密的重建流程,最终实现高精度建模。

weixin_29034963的博客 223

【洛谷 B3637】最长上升子序列 题解(动态规划+最长上升子序列)

这是一个简单的动规板子题。给出一个由nn≤5000个不超过106的正整数组成的序列。请输出这个序列的的长度。最长上升子序列是指,从原序列中取出一些数字排在一起,这些数字是的。

HEX9CF的技术博客 1850

【护网必备】Windows平台shellcode免杀加载器

bypass:McAfee、金山(数字签名)、火绒、ESET、卡巴企业版(时间5s 抖动50 Sleep_mask)、360全家桶(物理机)、Norton(加白程序资源)、WDF(PC)、WDF(Server)、Symantec(加白程序资源)bypass:金山(数字签名)、火绒、ESET、360全家桶(物理机)、WDF(PC)、WDF(服务器提示复查(关云保护))、McAfee、Norton(加白程序资源)、卡巴企业版(时间5s 抖动50 Sleep_mask)必须使用Bof操作,shell运行就掉线。

Fly_鹏程万里 1186

全志V3S嵌入式驱动开发(uboot移植)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 安装了ubuntu操作系统,有了开发板,下面就可以进行我们的开发工作了。第一步,我们要面临的问题就是uboot移植。一般来说,嵌入式的基础环境就是uboot、linux和rootfs。uboot完成一些基本硬件的初始化,比如cpu频率设置、ddr初始化、加载linux等等。早前,uboot的烧入比较麻烦,需要jtag工具才能完成。现在来说,很多soc支持系统直接从sd卡启动,这对开发

嵌入式-老费,一个分享专业嵌入式知识的blog 2818

最长上升子序列(O(nlogn))算法并输出最长上升子序列

最长上升子序列普通算法 dp[n]表示以a[n]结尾的最长上升子序列长度 显然有 dp[n]=max(dp[n],dp[i]+1) 满足a[i]<a[n],1<=i<n 实现过程时间复杂度为O(n^2) 2.O(nlogn)时间复杂度 思路是用数组lower保存最长上升子序列长度,对于当前元素a[i],若大于数组lower最后一个元素,则插入lower数组。否则,用二分在l...

一名计科学生的成长 3550

R语言Dunnett’s检验实战:寻找差异组之间的效果

总结起来,本文以R语言为工具,演示了如何使用Dunnett’s检验来找出单因素方差分析中不同组之间的效果差异。在本篇文章中,我们将通过R语言实战演示如何使用Dunnett’s检验来寻找不同组之间的效果差异。在分析结果时,通常我们会关注具有显著差异的组别,并基于Dunnett’s检验结果进行进一步的解释和讨论。首先,我们需要准备一组数据,假设我们有一个实验,涉及到四个不同的处理组和一个对照组。当我们发现方差分析结果显示存在显著差异时,我们可以进一步进行Dunnett’s检验来确定具体哪些组之间存在差异。

CoderExtra的博客 1104

最长上升子序列模型

上升子序列

m0_72747430的博客 805

基于simulink的软开关技术的三相逆变器仿真

三相逆变器中的软开关技术(Soft Switching Techniques)旨在减少开关损耗,提高效率,并降低电磁干扰(EMI)。实现软开关通常涉及使用谐振电路或准谐振电路来确保开关器件在零电压(Zero Voltage Switching, ZVS)或零电流(Zero Current Switching, ZCS)条件下进行切换。下面将详细介绍如何在Simulink中进行基于软开关技术的三相逆变器仿真设计。

xiaoheshang_123的博客 162

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

最长上升子序列的个数

先去重,去掉连续一段相同的数字,只保留一个,并且记录这个数字有多少个。设数组a[i]为去重后的数列,c[i]为a[i]对应的连续一段相同的数字的个数。 对a[i]做最长上升子序列,同时维护一个数组g[i],表示已a[i]为结尾的最长上升子序列的个数是多少,那么在计算f[i]的时候就要对g[i]处理一下(具体方法见代码)。 #include using namespace std; int

qust1508060414的博客 1599

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

最长上升子序列(nlogn)

思路:DP【i】表示长度为i+1的最长上升子序列结尾的最小值,初始化为inf,每次添加a【i】表示以a[i]为结尾的最长上升子序列。最后查询以inf结尾的下标就是最长上升子序列的长度。 #include <cstdio> #include <cstring> #include <algorithm> #include <set> #include<bits/stdc++.h> using namespace std; typedef long l.

Ray.C.L的博客 1127

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 最长重复子数组
下一篇: 区间子数组个数
鯉鱼
博客等级 码龄9年 6粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值