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

【leetcode hot 100 300】最长递增子序列

错误解法:在每次更新db[i]时,如果当前nums[i]>nums[i-1]就db[i-1]+1,否则db[i-1]

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        int[] db = new int[n]; // db[i]表示到i的最长严格递增子序列的长度
        db[0] = 1;
        for (int i = 1; i < n; i++) {
            db[i] = nums[i-1]<nums[i]?db[i-1]+1:db[i-1];
        }
        return db[n-1];
    }
}

错误原因:4<10 被记为1;后面3<8<9会在这个1上进行累加,但是10>3 8 9的,不正确

在这里插入图片描述

解法一:(动态规划)①定义:dp[i]表示以下标为i的字母结尾的最长严格递增子序列,dp[n] ②初始状态:dp[0]=1 ③状态转移方程:dp[i] = nums[j]<nums[i]?Math.max(db[j]+1,db[i]):1; max=Math.max(max,dp[i])(dp[i] = nums[i-1]<nums[i]?dp[i-1]+1:1❌没有考虑非连续性)

class Solution {
    public int lengthOfLIS(int[] nums) {
        // 定义:dp[i]表示以下标为i的字母结尾的最长严格递增子序列,dp[n]
        // 初始状态:dp[0]=1
        // 状态转移方程:dp[i] = nums[j]<nums[i]?Math.max(db[j]+1,db[i]):1; max=Math.max(max,dp[i])
        // dp[i] = nums[i-1]<nums[i]?dp[i-1]+1:1❌没有考虑非连续性
        int n = nums.length;
        int[] db = new int[n]; // db[i]表示以i解为的最长严格递增子序列的长度
        db[0] = 1;
        int max = 1;
        for (int i = 1; i < n; i++) {
            db[i]=1; // db[i]最少包含它本身,赋值为1
            for(int j = 0;j<i;j++){
                if(nums[i]>nums[j]){
                    // nums[j]>nums[i]严格递增,可以取以i结尾的最长长度+1
                    db[i] = Math.max(db[j]+1,db[i]);
                }
            }
            max = Math.max(max, db[i]);
        }
        // 返回的结果是最长递增子序列,而不是以i结尾的最长递增,不能返回db[n-1]
        // 返回结果要在过程中记录
        return max;
    }
}

注意:

  • db[i]表示以i为结尾的最长严格递增子序列的长度。
  • 返回的结果是最长递增子序列,而不是以i结尾的最长递增,不能返回db[n-1]。返回结果要在过程中记录。
  • dp[i]可以直接表示题目要求,也可以表示另外的含义,辅助算出题目要求,eg:db[i]表示以i为结尾的最长严格递增子序列的长度
http://www.dtcms.com/a/126484.html

相关文章:

  • NoV病毒抗原抗体,助力疫苗研究与诊断试剂开发!
  • 大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比,选择合适自己的LLM工具
  • 某局jsvmp算法分析(dunshan.js/lzkqow23819/lzkqow39189)
  • BERT - 段嵌入(Segment Embedding)
  • Composer安装Laravel步骤
  • mybatis多表查询
  • Python实例题:Python实现iavaweb项目远端自动化更新部署
  • 解决双系统ubuntu24.04开机出现花屏等情况
  • Java面试黄金宝典48
  • Java 多线程编程之原子类 AtomicBoolean(构造方法、获取与设置、比较并设置)
  • rancher 解决拉取dashboard-shell镜像失败的问题
  • Wincc管对象的使用
  • 【ESP32-microros(vscode-Platformio)】
  • Go 语言中的 package main、 func main() 和main.go的使用规范
  • 浮点数比较在Eigen数学库中的处理方法
  • AI前沿周报:2025年3月技术深度解析
  • Express中间件(Middleware)详解:从零开始掌握(1)
  • 在Java项目中,引入【全局异常处理器】
  • HarmonyOS-ArkUI V2装饰器-@Once
  • 第一节:React 基础篇-React虚拟DOM原理及Diff算法优化策略
  • 【Web功能测试】注册与登录功能测试用例设计深度解析
  • (十四)安卓开发中的RecyclerView详解
  • Python 和 JavaScript两种语言的相似部分-由DeepSeek产生
  • 计算机操作系统-【死锁】
  • 信奥赛之c++基础(循环结构之for循环)
  • Java常用工具算法-6--秘钥托管云服务3--微软zure Key Vault
  • 第5章,将 Toy IR 程序部分地下降到更低层的 dialect 以便优化
  • 【Grok 大模型深度解析】第二期:架构探秘与训练哲学
  • 在AMGX中使用MPI加载自定义分布式矩阵和向量
  • 自定义函数:为接口开发增添灵活性 - Apipost 的独特优势