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

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

java 复制代码
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❌没有考虑非连续性)

java 复制代码
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为结尾的最长严格递增子序列的长度
相关推荐
callJJ5 分钟前
从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序
java·数据结构·算法·深度优先·图论·广度优先·图搜索算法
脱脱克克1 小时前
2025.4.9 华为机考 第1题-补丁版本升级
python·算法·华为
liuluyang5304 小时前
C语言C11支持的结构体嵌套的用法
c语言·开发语言·算法·编译·c11
勤劳的进取家5 小时前
贪心算法之最小生成树问题
数据结构·python·算法·贪心算法·排序算法·动态规划
牛奶咖啡.8545 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
c语言·数据结构·c++·算法·蓝桥杯
SuperW5 小时前
蓝桥杯嵌入式十五届模拟二(串口DMA,占空比的另一种测量方式)
单片机·职场和发展·蓝桥杯
亓才孓5 小时前
[leetcode]stack的基本操作的回顾
算法
小美爱刷题5 小时前
力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和
算法·leetcode·链表
Fanxt_Ja6 小时前
【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)
java·数据结构·算法·红黑树
永恒迷星.by6 小时前
全球变暖(蓝桥杯 2018 年第九届省赛)
算法