673. 最长递增子序列的个数
给定一个未排序的整数数组,找到最长递增子序列的个数。
解题思路: 之前做过求最长增序列的题,用DP,Dynamic Programming解,但是此题不但想求出最长序列的长度,还想知道这个长度对应的序列有多少个,这让我想起了之前做PAT题,求城市最佳的救援路径长度并且这个长度对应的路径有多少条。与此题场景非常类似,那题是用DFS解的,当然此题也可以用DFS解,但是子序列的题一般用DP解比较方便。此题用两个DP数组解题,len[i]表示以num[i]结尾的最长递增子序列的长度,cnt[i]表示以num[i]结尾的最长递增子序列的个数。
[LeetCode] 673. Number of Longest Increasing Subsequence 最长递增序列的个数
class Solution {
public:
int findNumberOfLIS(vector<int>& nums) {
int res = 0, n = nums.size(), mxLen = 0;
vector<int> len(n, 1), cnt(n, 1);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[i] <= nums[j]) continue;
if (len[i] == len[j] + 1) cnt[i] += cnt[j];
else if (len[i] < len[j] + 1) {
len[i] = len[j] + 1;
cnt[i] = cnt[j];
}
}
if (mxLen == len[i]) res += cnt[i];
else if (mxLen < len[i]) {
mxLen = len[i];
res = cnt[i];
}
}
return res;
}
};