算法

LeetCode题解:最长递增子序列

2022-05-20  本文已影响0人  搬码人

题目描述

给你一个整数数组nums,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。

示例

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

思路方法

动态规划
创建一个与nums等长的数组dp[ ],dp中记录的是从开始到当前节点的最长递增子序列。
从nums数组的最左端开始遍历,若发现比之前的数组值大则进行一次判断dp[i] = Math.max(dp[i],dp[j]+1),之前节点值+1 与当前节点值进行比较并取最大值,记录下当前的最长子序列maxVal = Math.max(maxVal,dp[i])。
由于该方法是从最左端开始,并且每次是两两比较最大值,所以不存在重复问题。

class Solution {
    public int lengthOfLIS(int[] nums) {
        int length = nums.length;
        if(length==0){
            return 0;
        }
        int maxVal = 1;
        int[] dp = new int[length];
        dp[0] = 1;
        for(int i=1;i<length;i++){
            dp[i] =1;
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]){
                    dp[i] = Math.max(dp[i],dp[j]+1);
                }
            }
            maxVal = Math.max(maxVal,dp[i]);
        }
        return maxVal;
    }
}
上一篇下一篇

猜你喜欢

热点阅读