问题描述
给定一个未排序的整数数组,找到最长递增子序列的个数。
示例 1:
输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
来源:LeetCode
解法一
计算LIS的个数,LIS的解法在这里。因为最长递推子序列的个数是不同的,分两种情况:1.LIS[i]是最大的LIS,但以i结尾的LIS个数有多个,在遍历的过程中,逐渐把刚好等于最大长度-1的,都加和起来,作为LIS[i]的序列个数;2.不同结尾的LIS可能都是最大值,则需要把这些也加和,作为最终的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: int findNumberOfLIS(vector<int>& nums) { int n = nums.size(); if(n <= 1) return n; vector<int> dp(n, 1); vector<int> count(n, 1); int max_len = 1; for(int i = 1; i < n; i++) { for(int j = 0; j < i; j++) { if(nums[j] < nums[i]) { if(dp[j] >= dp[i]) { dp[i] = dp[j] + 1; count[i] = count[j]; } else if(dp[j] + 1 == dp[i]) { count[i] += count[j]; } } } max_len = max(max_len, dp[i]); } int cnt = 0; for(int i = 0; i < n; i++) { if(max_len == dp[i]) { cnt += count[i]; } } return cnt; } };
|