LeetCode 300.最长上升子序列(超详细)

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

LeetCode 300.最长上升子序列(超详细)

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

示例:

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

说明:

  • 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
  • 你算法的时间复杂度应该为 O(n2) 。

进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

一、O(n^2)解法:(动态规划)

  • 证明优化子结构:
    假设最长递增子序列中包含元素ak, 那么一定存在一组最优解,
    它包含了a1, a2, …, ak-1 这个序列的最长递增子序列,
    否则可以推出该解不是最优解

  • 重叠子问题:

    容易知道子问题重叠

  • 定义dp[i]:从0到i的以num[i]结尾的最长上升子序列

  • 状态转移方程:

    对于 j<I ,如果num[j]<num[i] ,那么我们就可以用dp[j]来更新dp[i],在num[j]后面加上num[i],所以有:

    dp[i] = max( dp[j] ) + 1, 0 < j < i 且 num[j],num[i]

    dp[i] = 1, 其他情况

  • 代码

    class Solution {
        public int lengthOfLIS(int[] nums) {
            if(nums.length < 2)
                 return nums.length;
            int[] dp = new int[nums.length];
            dp[0] = 1;
            int ans = 1;
            for(int i = 1;i<nums.length;i++)
            {
                int cnt = 0;
                for(int j=0;j<i;j++)
                {
                    if(nums[i]>nums[j])
                       cnt = Math.max(cnt,dp[j]);
                }
                dp[i] = cnt+1;
                ans = Math.max(ans,dp[i]);
            }
            return ans;
        }
    }
    

二、O(nlogn)解法(贪心+二分查找)

  • 贪心策略:要让上升子序列尽可能长,就让其上升的缓慢一些,因此我们希望每次加在上升子列最后的那个数在满足条件的情况下尽可能小

  • 定义d[i]:表示长度为 i 的最长上升子序列的末尾元素的最小值

  • 证明d[i]单调:

    如果 d[j]>=d[i] 且 j<i,我们考虑从长度为 i 的最长上升子序列的末尾删除 i-j个元素,那么这个序列长度变为 j,且第 j个元素必然小于 d[i],也就小于 d[j]。那么我们就找到了一个长度为j 的最长上升子序列,并且末尾元素比 d[j]小,从而产生了矛盾。因此数组 d[i]单调

  • 流程:
    设当前已求出的最长上升子序列的长度为 len(初始时为 1,
    因为d[1] = num[0]),从前往后遍历数组num,在遍历到
    num[i] 时:
    如果 num[i]>d[len] ,则直接加入到 d 数组末尾,并更新 len = len+1;
    否则,在 d 数组中二分查找,找到第一个比 num[i]小的数 d[k] ,并更新 d[k+1] = num[i]

    示例:[ 1 , 3 , 2, 5 , 11 , 0]

    第一步插入1 ,d = [1];

    第二步插入3 ,d = [1,3];

    第三步插入2 ,d = [1,2];

    第四步插入3 ,d = [1,2,5];

    第五步插入11 ,d = [1,2,5,11];

    第六步插入0 ,d = [0,2,5,11];

    第六步看起来可能有问题,但是其不仅不会影响返回值,并且保证了贪心策略正确性,因为新来的并不影响已有的最大长度,但是可以更新为更好(更慢增长)的组合。

  • 代码

    class Solution {
        public int lengthOfLIS(int[] nums) {
            if(nums.length < 2)
                 return nums.length;
            int[] d = new int[nums.length];
            int j=0;
            d[j] = nums[0];
           for(int i=1;i<nums.length;i++)
           {
               if(nums[i]>d[j])
                   d[++j] = nums[i];
                else
                {
                    int l = 0,r=j,pos=0;
                    boolean falg=false;
                    int mid =(l+r)>>1;
                    while(l<=r)
                    {
                        mid =(l+r)>>1;
                        if(d[mid]<nums[i])
                        {
                            falg = true;
                            pos = mid;
                            l = mid+1;
                        }
                        else 
                           r =mid-1;
                    }
                    if(falg)
                       d[pos+1] = nums[i];
                    else
                        d[pos] = nums[i];
                }
           }
           return j+1;
        }
    }
    
动态规划——最长上升子序列模型 阅读详情

相关推荐

最长上升子序列/子串和最长公共子序列/子串

文章目录子序列(不连续)最长上升子序列(暴力回溯)(动规)(动规 + 二分 + 贪心)(动规 + 二分 + 贪心)化简版最长公共子序列(动规)(动规)子序列(连续)最长连续上升子序列(动规)(双指针)最长公共子数组 (动规)(动规 一维数组优化)(滑动窗口 待更新) 子序列(不连续) <span id = “最长上升子序列">最长上升子序列 LIS(longest increasing subsequence)是最经典的动态规划题目之一,因为它的递推公式很有条理,可以很清楚的告诉我们什么状态可以

_zhy_cq 1306

最长上升子序列(序列长度+序列输出)

一、LIS的定义: 最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。假设我们有一个序列 b i,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们也可以从中得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N,但必

时光、疏离了记忆づ童话的博客 9219

leetcode 300:最长上升子序列

leetcode 300:最长上升子序列 题目描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。最长上升子序列不要求是连续的。 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 解题步骤: 1、 状态定义:采用一维数组dp[i]来表示代表 nums 前i个数字的最长子序列长度,其中nums[i]表示上升过...

张毅的博客 428

DP————LIS(最长上升子序列)和LCS(最长公共子序列)问题

LIS问题 https://www.acwing.com/problem/content/898/ 思路:首先数组a中存输入的数(原本的数),开辟一个数组f用来存结果,最终数组f的长度就是最终的答案;假如数组f现在存了数,当到了数组a的第i个位置时,首先判断a[i] > f[cnt] ? 若是大于则直接将这个数添加到数组f中,即f[++cnt] = a[i];这个操作时显然...

avq94452的博客 555

python【力扣LeetCode算法题库】300 最长上升子序列(动态规划)

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

NJU phd 在读。 867

程序化广告行业(23/89):深度剖析广告效果评估指标

大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要

yyy173611的博客 4863

最长上升子序列

最长上升子序列模型贪心与动态规划解题的策略整理

m0_73832482的博客 1200

基于YOLOv8的玉米病害监测系统

本研究的主要目标是设计并实现一个基于深度学习的玉米病害识别系统,通过采用YOLOv8算法进行玉米叶片病害的自动化识别。研究首先对玉米病害的种类和特点进行了分析,选择了具有代表性的病害类型,如玉米锈病、灰叶斑病、枯叶病和健康叶片,以构建一个多类别的分类问题。数据集的构建和处理是研究的关键部分,通过数据增强、图像标注等手段确保了数据的多样性和丰富性,从而提高了模型的泛化能力。

yupan__的博客 496

leetcode 最长上升子序列(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现) leetcode题目 最长上升子序列 -- leetcode 300 题目描述 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组...

聚沙成塔 3053

HDLbits练习11 - Counter 1-12 ( Exam/ece241 2014 q7a )

(如这题用于当复位信号为高或者计数器递增至12时,该信号置1使计数器的输入信号 ’ d ’ 变为 ’ 4’b0001 ’ ,再加载到 ’ Q ’ 中。当 ’ load ’ 信号为高时,在时钟的上升沿,计数器会将 ’ d ’ 输入的值加载到 ’ Q ’ (计数器的输出)中,而不是递增当前值。用途:在时钟上升沿触发的情况下,如果 ’ enable ’ 信号为高,计数器的值会递增,如果 ’ load ’ 信号为高,计数器将加载 ’ d ’ 信号的值。作用: ’ Q ’ 是计数器的当前值,也是模块的主要输出。

weixin_62830176的博客 472

Dify+MCP 双剑合璧:告别知识库模糊统计,让AI精准查询数据库数据!

本文详细介绍了如何通过Dify和MCP的结合,解决知识库在数据库查询中的模糊统计问题。通过MCP中间件将自然语言实时转换为SQL语句,实现精准数据查询,并支持SSE协议持续更新数据。文章包含MySQL环境搭建、MCP服务端部署、Dify工作流配置等实战步骤,帮助用户高效构建智能数据库查询系统。

weixin_33737774的博客 368

LeetCode:300. 最长上升子序列(python)

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

wk的博客 3234

绝对旋转编码器学习笔记(基本原理,与PC通信等,不定期更新中)

前言 最近开始学习编码器相关内容,目的在于搞清楚编码器的原理,与上位机的联系等问题。笔记资料来源为网络,整理的同时也会有一些总结和感悟。由于研究方向需求,主要研究数字旋转编码器。 1.编码器的定义 编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。——摘自《百度百科》 通常来说,编码器可以将角度位移、直线位移、转速等物理量转换为电信号。这里的电信号根据不同原理的编码器输出脉冲、二进制数码等不同的类型,下面会提到。 2.编码器的分类 编.

黑化咸鱼的博客 1万+

【力扣LeetCode】300 最长上升子序列

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

Jiewang的博客 1168

解决在封装自定义IP时加入ila,或者其他ip核时出错的情况

在查阅很多资料后,明白了这个应该是软件bug,但是最终还是解决了问题 我们只需要删除

weixin_42553916的博客 3604

目标跟踪与视频时序分析基础

两帧均有目标,却因快速移动导致检测框无重叠,仅靠交并比(IoU)无法维持身份关联。本文通过手算与纯Python实现最小跟踪流程,揭示IoU仅为位置线索,不能应对快速位移或遮挡。实验表明,即使目标真实存在,低重叠也会触发新编号。强调跟踪需结合运动预测、外观特征与阈值验证,避免误判。

Mr数据杨 2335

Leetcode 300. 最长上升子序列 C++

Leetcode 300. 最长上升子序列 题目 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。 题解 动态规划 令dp[i]表示以nums[i]结尾的最长上升子序列的长度。显然,dp[i] = max(dp[i],dp[j]+1),其中j

weixin_43750513的博客 219

运动控制软件:Siemens Sinamics二次开发_(6).通信接口与协议详解

PROFIBUSPROFINETModbus TCPCANopenEtherCAT每种通信接口都有其特定的应用场景和优势。选择合适的通信接口可以显著提高系统的性能和可靠性。在选择通信协议时,需要根据具体的应用场景和需求综合考虑。每种通信协议都有其特定的优势和局限性,因此在设计运动控制系统时,应选择最适合的协议,以确保系统的性能、可靠性、成本和维护性。通过以上对比和分析,希望开发者能够更好地理解和选择适合的通信接口和协议,从而优化运动控制系统的开发和应用。

2401_87715305的博客 898

[动态规划]Leetcode 300.最长上升子序列(python)

[动态规划]Leetcode 300.最长上升子序列(python) 题目描述 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例1 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 DP定义及状态方程 定义dp[i]表示以第i个元素结尾的最长递增子序列长度。那么对于该元素前面的i-1个元素中如果有元素j比nums[i]小,那么dp[i]就等于以元素j结尾的最长递增子序列长度加1,即dp[i] = max(

阿旭的博客 1845

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

300. 最长上升子序列

300. 最长上升子序列

底层码农 6293

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最长上升子序列_LeetCode 题解 | 300.最长上升子序列

点击上方蓝字设为星标每周一、三、五上午 8:30 准时推送下面开始今天的学习~力扣题解自题解功能上线以来题解区涌现了很多优质题解如果你有更好的解题思路不如来题解区大显身手你可获得1.力扣官方平台推荐2.力扣积分1篇精选题解:200 力扣积分(注:题解著作版权归发布者本人所有)本期精选题解由我们的用户“ColdMe”倾情撰写,一起来看看吧!300. 最长上升子序列(点击文末阅读原文查看题目...

weixin_39608988的博客 160

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeetCode:300.最长上升子序列

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

Doraemon_Zzn的博客 274

Leetcode 300 最长上升子序列 C++,Python,Java

Leetcode300 最长上升子序列 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-increasing-subsequence 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给定一个无序的整数数组,找到其中最长上升子序列的长度。c 示例 1: 输入: [10,9,2,...

Rp的博客 286

leetcode题:300. 最长上升子序列(中等)

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

tankpanv的博客 201

力扣300——最长上升子序列

这道题主要涉及动态规划,优化时可以考虑贪心算法和二分查找。 原题 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为O(n2) 。 进阶: 你...

death05的博客 1261

Leetcode300. 最长上升子序列(C语言)

Leetcode300. 最长上升子序列(C语言) 题目: 给定一个无序的整数数组,找到其中最长上升子序列的长度。例: *输入: [10,9,2,5,3,7,101,18] 输出: 4 * 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 思路: 法一:动态规划。第i个元素之前的最小上升子序列的长度无非就是max(dp[i],dp[j]+1); 法二:二分查找法。 dp[i]存...

jeanlu的博客 1229
上一篇: 关于在List中删除元素引起ConcurrentModificationException的问题
下一篇: Java中的==与equals
Joe_hsj
博客等级 码龄8年 6粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值