【LeetCode】最长递增子序列的个数 Java 题解
题目描述
给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。
注意 这个数列必须是 严格 递增的。
复制代码
思路分析
今天的算法题目是数组题目,题目要求找出其中 最长严格递增子序列的个数。我们把这个问题分解成两个子问题,一个子问题是求最长严格递增子序列。第二个是求求最长严格递增子序列的个数。
求最长严格递增子序列是经典问题,有多种解法,首先可以使用基础动态规划方法解决,思路的核心是以 nums[i] 为结尾的最长上升子序列。定义 DP 数组,初始化 DP[i] = 1, 然后采用 for 双重循环, 定义变量 j 且 j < i, 在 [j, i] 区间,动态更新递增的最大值。基础的 DP 的时间复杂度是 O(n * n), 空间复杂度是 O(n)。
求出了最长严格递增子序列,我们还需要求最长严格递增子序列的个数。我们在这里定义一个 cnt 计数器,当 dp[j] + 1 == dp[i], cnt[i] += cnt[j]来累加相同长度出现的次数。当 dp[j] + 1 > dp[i]时,重新计数。具体实现代码如下,供参考。
通过代码
复制代码
总结
上述算法的时间复杂度是 O(n * n), 空间复杂度是 O(n)
这个题目非常经典,我们采用分治的思想,将这个题目拆分成两个子问题,逐个击破,解决问题。多练习几遍,体会更深。
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【Albert】的原创文章。
原文链接:【http://xie.infoq.cn/article/802927a89a13d2406800dd0eb】。文章转载请联系作者。
评论