• 最长递增子序列


    最长递增子序列

    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

    子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

    示例 1:

    输入:nums = [10,9,2,5,3,7,101,18]
    输出:4
    解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
    示例 2:

    输入:nums = [0,1,0,3,2,3]
    输出:4
    示例 3:

    输入:nums = [7,7,7,7,7,7,7]
    输出:1

    提示:

    1 <= nums.length <= 2500
    -104 <= nums[i] <= 104

    进阶:

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

    解题思路:
    动态规划
    dp[i]表示i之前包括i的以nums[i]结尾最长上升子序列的长度。

    位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
    所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
    注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值。

    每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是1。

    class Solution {
        public int lengthOfLIS(int[] nums) {
            //dp数组表示每个位置取得的最长严格递增子序列的长度
            int[] dp = new int[nums.length];
            //每个位置的最长严格递增子序列的长度至少为1
            for (int i = 0; i < nums.length; i++) {
                dp[i] = 1;
            }
            int res = 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[i], dp[j] + 1);
                    }
                }
                if (res < dp[i]) {
                    res = dp[i];
                }
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    Linux如何查看系统信息
    SpringMVC 04: SpringMVC中4种页面跳转方式
    Pyside6:信号与槽
    2023秋招笔试算法Python3题解
    Python期末复习题:组合数据类型
    【面试题】 你不知道的JavaScript基础类型
    ubuntu配置jdk
    深入Java集合:ArrayList 源码解析 - JDK8
    Linux服务器上搭建JupyterNotebook教程
    快速掌握Golang单元测试与断言教程
  • 原文地址:https://blog.csdn.net/weixin_45295612/article/details/125545020