当前位置: 首页 > article >正文

力扣300-最长递增子序列(Java详细题解)

题目链接:300. 最长递增子序列 - 力扣(LeetCode)

前情提要:

本题是子序列问题的开始篇,接下来我将更新子序列篇章的dp问题。

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

本题题目描述要求我们对数组中找到最长的递增子序列,子序列可以是不连续的元素。

话不多说,直接用dp五部曲系统分析一下。

1.确定dp数组和i下标的含义。

本题要求最长严格递增子序列的长度,所以dp[i]定义为以下标i结尾的数组最长递增子序列的长度。

2.确定递推公式。

本题是求的递增的子序列,所以肯定是要让用nums[j] 来遍历nums[i]。

如果nums[i] > nums[j]才是递增的,就可以添加到我们的结果集中。

那么怎么才能得出本数组的最长递增长序列呢?

其实有点像力扣139的单词拆分,如果j到i这段是递增(nums[i] > nums[j])的,那么i的最长递增子序列就为dp[j] + 1。

就为之前以j为结尾的最长递增子序列加上nuns[i]这个元素,所以就为dp[j] + 1。

因为要求最长递增长序列,所以需要对dp[i] 取一个最大。

dp[i] = Math.max(dp[j] + 1,dp[i]);

3.dp初始化。

由dp数组可以看出,dp[i]是指以下标i结尾的数组最长递增子序列的长度。所以每个dp[i]的最长递增子序列都最少为1。

那么我们就将整个数组都初始化为1。

4.确定dp的遍历顺序。

由递推公式可以看出 dp[i] = Math.max(dp[j] + 1,dp[i]);,而dp[j]又是要遍历dp[i] ,所以遍历顺序只能是从前往后遍历。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

最终代码:

class Solution {
    public int lengthOfLIS(int[] nums) {
        //dp数组定义 以nums[i]为结尾的最长子序列的长度
        //在这里要对nums长度为1进行特判,因为如果长度为1就不会进入循环 而我的result 是初始化为0 所以会为0
        //但是如果nums长度为1 他的最长递增子序列就是他本身 所以长度为1 你初始化result = 1也可以
        if(nums.length == 1)return 1;
        //该题关键就是递推公式 
        int [] dp = new int [nums.length + 1];
        int result = 0;
        Arrays.fill(dp,1);
        for(int i = 1;i < nums.length;i ++){
            for(int j = 0;j < i;j ++){
                if(nums[i] > nums[j]){
                    dp[i] = Math.max(dp[j] + 1,dp[i]);
                }
            }
            //收集结果的地方 可能不是最后一个位置 可能是任意位置 所以要对任意位置结尾的最长子序列的长度取一个最值
            result = Math.max(result,dp[i]);
        }
        return result;

    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!


http://www.kler.cn/news/313513.html

相关文章:

  • 软考无损连接判断
  • Apache Airflow如何使用
  • Python编码系列—Python策略模式:灵活应对变化的算法策略
  • Java 在 GIS 领域的学习路线?
  • 硬件工程师笔试面试——开关
  • 数据飞轮崛起:数据中台真的过时了吗?
  • 基于python+django+vue的旅游网站系统
  • 【script】java武魂技展示:在java中使用不同的脚本语言 一文体现java生态的强大
  • -bash: apt-get: command not found -bash: yum: command not found
  • 算法-深度拷贝链表(138)
  • 毕业设计选题:基于ssm+vue+uniapp的校园商铺系统小程序
  • 【PCL实现点云分割】ROS深度相机实践指南(上):PCL库初识和ROS-PCL数据类型转换
  • 解决Mac下Vscode编译运行C语言程序会自动生成DSYM文件夹的问题
  • Vue使用代理方式解决跨域问题
  • rancher 图形化界面
  • 用 JS 实现一个发布订阅模式
  • Stable Diffusion绘画 | ControlNet应用-qrcode 二维码控制器:艺术二维码来啦
  • 基于微服务架构的非结构化数据中台设计
  • 网址匹配正则表达式(python实现)
  • SaaS 架构:益处及挑战
  • 安谋科技发布全新自研“玲珑”多媒体处理器
  • macOS 中搭建 Flutter 开发环境
  • 微软发布Windows Agent Arena 为生成式AI代理提供基准测试
  • 动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct
  • [网络层]-IP协议相关特性
  • 记忆化搜索专题——算法简介力扣实战应用
  • JavaScript 与 Java 的继承有何区别?-----原型继承,单继承有何联系?
  • 微信小程序/uniapp 程序分包处理,小程序性能优化
  • 错题集锦之C语言
  • NumPy库学习之argmax函数