vlambda博客
学习文章列表

动态规划-673. 最长递增子序列的个数

点击蓝字关注我,一起成长

动态规划-673. 最长递增子序列的个数
1

题目

给定一个未排序的整数数组,找到最长递增子序列的个数。

2

样例

示例1:

输入: [1,3,5,4,7]

输出: 2

解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。


示例2:

输入: [2,2,2,2,2]

输出: 5

解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。

注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。

3

解答与代码

由上分析可得:

  1. 设置dp数组,记录从 0 - i 的路径长度。

  2. 设置count数组,记录从 0 - i 的路径数。

  3. 对于0 - i 中,每一个 j < i, 有:

    假设 num[j]  < num[i] ,则:

    (1) 如果dp[j] + 1 > dp[i] ,表示通过 j 到 i 这条路径更长,所以,count[i] = count[j],即是通过 j 有多少条路径,那么都可以到达 i ;

    (2) 如果dp[j] + 1 == dp[i] , 表示前面已经有某个数 k (假设为k),通过 k 到达 i 的路径长度跟 通过 j 到达 i 的路径长度是一样的,而且也是到达 i 最长的路径。所以我们可以得到:到达 i 并且路径长度为 dp[i] 的路径可以由 k -> i 以及 j -> i 这两条路径,可得:count[i] += count[j];

答案:

import java.util.*;class Solution { public int findNumberOfLIS(int[] nums) { int size = nums.length; int[] dp = new int[size]; int[] count = new int[size]; Arrays.fill(dp, 1); Arrays.fill(count, 1);
int result = 0; int max = 0; for(int i=0;i<size;i++){ for(int j=0;j<i;j++){ if(nums[i] > nums[j]){ if(dp[j] + 1 > dp[i]){ dp[i] = dp[j] + 1; count[i] = count[j]; }else if(dp[j] + 1 == dp[i]){ count[i] += count[j]; } } } max = Math.max(max, dp[i]); } for(int i=0;i<size;i++){ if(dp[i] == max){ result += count[i]; } } return result; }}
动态规划-673. 最长递增子序列的个数

4

预告

本次专题:动态规划算法

明天预告题目:

LeetCode-64. 最小路径和



● 扫码关注我


题目素材来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/unique-paths-ii


欢我的内容就点“在看”分享给小伙伴哦