给定一个未排序的整数数组 nums
, 返回最长递增子序列的个数 。
注意 这个数列必须是 严格 递增的。
示例 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。
提示:
1 <= nums.length <= 2000
-106 <= nums[i] <= 106
解析:
这道题可以将dp数组设置成二维的,其中第一维进行递增序列个数的计算,第二维进行前i位包含递增序列长度的计算。两层for循环第一层,按nums数组长度,第二层按i的值划分,比较数组中元素大小,进行长度累加;长度累加结束后,将所有n - 1长度所在个数全部加到n长度中。在每层i的最后计算长度最大值,并将该次循环中等于最大值的个数累加。如果最大值更新,则个数累加也更新即可。
源码:
class Solution {
public:
int findNumberOfLIS(vector<int>& nums) {
int length = nums.size();
vector<vector<int>> dp(2, vector<int>(length, 1));
dp[0][0] = 1; // 个数
for (int i = 0; i < length; i++) {
dp[1][i] = 1;
}
int max_value = 0;
int result = 0;
for (int i = 0; i < length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
if (dp[1][i] == dp[1][j] + 1) {
dp[0][i] += dp[0][j];
} else if (dp[1][i] < (dp[1][j] + 1)){
dp[0][i] = dp[0][j];
dp[1][i] = dp[1][j] + 1;
}
}
}
if (dp[1][i] > max_value) {
max_value = dp[1][i];
result = dp[0][i];
} else if (dp[1][i] == max_value) {
result += dp[0][i];
}
}
//cout << max_value << endl;
cout << max_value << endl;
for (int i = 0; i < length; i++) {
cout << dp[0][i] << "-" << dp[1][i] << endl;
}
return result;
}
};