【Java】dp--最长递增子序列

简介: 文章目录前言1.dp数组的定义2.base case3.代码

前言

参考了别人的解法,和解析,自己再来描述一下过程,希望对朋友们有帮助。


1.dp数组的定义

本题dp数组的定义为:dp[i]表示以nums[i]这个数结尾的最长递增子序列的长度:也就是在 i这个索引对应下的dp值为最长递增子序列的长度


2.base case

只要所给数组序列长度大于1,那么dp[1]的值为 1,第一个值就为 1。


base case :dp[i]的初始值为 1 。 接下俩思考如何设计算法逻辑 进行状态转移 ,用到数学归纳的思想。


假设现在要求dp[5],也就是求nums[5]为结尾的最长递增子序列。

既然是递增子序列,只要找到前面那些结尾比nums[5]值小的子序列,

然后相当于把nums[5]的值接在后面,新的子序列加一。


用实例来操作一下:


比如现在有个数组为 nums=[1,6,4,3,5,4],

我们要求nums[5],那么我们如果知道比它的值小的序列,也就是nums[3],它的最长序列为2,那么nums[5]的最长序列就为2+1,它的最长序列就为3,以此类推,然后dp数组中的最大值就是该数组最长递增子序列。


在一个循环中求得了dp[5]的值,那么要求dp[1],dp[2]…

只需要外面加一个nums长度的循环for(int i = 0;i<nums.length;i++)


3.代码

//Subsequences are not continuous
class zuihcangdizeng{
    public static void main(String[] args) {
        int[] nums = new int[6];
        nums[0] = 1;
        nums[1] = 6;
        nums[2] = 4;
        nums[3] = 3;
        nums[4] = 5;
        nums[5] = 4;
        System.out.println(lengthOfLisDp(nums));
    }
    public static int lengthOfLisDp(int[] nums){
        int[] dp = new int[nums.length];
        for(int i=0;i<nums.length;i++){
            dp[i] = 1;
        }
        for(int i = 0;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);
                }
            }
        }
        int res = 0;
        for(int i=0;i<dp.length;i++){
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}
相关文章
|
7月前
|
存储 Java 数据处理
|
Java 测试技术
【Java】剑指offer(31)栈的压入、弹出序列
【Java】剑指offer(31)栈的压入、弹出序列
|
5月前
|
Arthas 监控 算法
JVM成神路终章:深入死磕Java虚拟机序列总纲
JVM成神路终章:深入死磕Java虚拟机序列总纲
126 1
编程作业(2) - 编程题 10. DNA序列(Java)
编程作业(2) - 编程题 10. DNA序列(Java)
|
7月前
|
Java Go C++
Golang每日一练(leetDay0112) 2、3、4的幂
Golang每日一练(leetDay0112) 2、3、4的幂
62 0
Golang每日一练(leetDay0112) 2、3、4的幂
|
7月前
|
Java Go C++
Golang每日一练(leetDay0085) 2的幂、数字 1 的个数
Golang每日一练(leetDay0085) 2的幂、数字 1 的个数
54 0
Golang每日一练(leetDay0085) 2的幂、数字 1 的个数
|
7月前
|
Java Go C++
Java每日一练(20230420) 罗马数字转整数、电话号码的字母组合、排列序列
Java每日一练(20230420) 罗马数字转整数、电话号码的字母组合、排列序列
65 0
Java每日一练(20230420) 罗马数字转整数、电话号码的字母组合、排列序列
|
7月前
|
Java
Java栈的压入、弹出序列(详解)
Java栈的压入、弹出序列(详解)
88 0
|
7月前
|
Java
105. 从前序与中序遍历序列构造二叉树 --力扣 --JAVA
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
66 1
|
Java
594. 最长和谐子序列 --力扣 --JAVA
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
47 0