动态规划

最长递增子序列

中等#300Java时间 O(n²),教学解法空间 O(n)

题目要做什么

返回数组中严格递增子序列的最长长度。子序列允许跳过元素,但保留原来的相对顺序。

题目示例输入nums = [10,9,2,5,3,7,101,18]
题目示例输出4

01 为什么这样做

dp[i] 表示必须以 nums[i] 结尾的最长递增子序列长度。枚举此前更小的元素 j,尝试用 dp[j]+1 连接到当前元素。

始终成立的条件

计算 dp[i] 时,所有 j < i 的最优长度已经确定。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int lengthOfLIS(int[] nums) {3        int[] dp = new int[nums.length];4        Arrays.fill(dp, 1);5        int best = 0;6        for (int i = 0; i < nums.length; i++) {7            for (int j = 0; j < i; j++) {8                if (nums[j] < nums[i]) dp[i] = Math.max(dp[i], dp[j] + 1);9            }10            best = Math.max(best, dp[i]);11        }12        return best;13    }14}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索