Given an unsorted array of integers, find the number of longest increasing subsequence.
Example 1:
Input: [1,3,5,4,7] Output: 2 Explanation: The two longest increasing subsequence are [1, 3, 4, 7] and [1, 3, 5, 7].
Example 2:
Input: [2,2,2,2,2] Output: 5 Explanation: The length of longest continuous increasing subsequence is 1, and there are 5 subsequences' length is 1, so output 5.
Note: Length of the given array will be not exceed 2000 and the answer is guaranteed to be fit in 32-bit signed int.
Title:
Find the number of longest increasing subsequences.
Ideas:
First of all, for the 1 solution of the longest increasing subsequence, you can refer to https://blog.csdn.net/u013178472/article/details/54926531. As for the number, you can add an array count, count[i] to represent the number of the i-th longest increasing subsequence. It can be known that count[i] is initialized to 1, for len[i]==len[j]+1, then count[i]+=count[j], because its number must be added to the previous, for len[ i]<len[j]+1, then count[i]=count[j]. Finally, find the longest length, and judge whether len[i] is equal to maxn, and if it is equal, add count[i] to the total number.
Code:
class Solution { public int findNumberOfLIS(int[] nums) { int []len=new int[nums.length]; int []count=new int[nums.length]; for(int i=0;i<nums.length;i++) { len [i] = 1; count[i]=1; } int maxn=1; for(int i=1;i<nums.length;i++) { for(int j=0;j<i;j++) { if(nums[j]<nums[i]) { if (len [i] == len [j] +1) count[i]+=count[j]; else if(len[i]<len[j]+1) { len [i] = len [j] +1; count[i]=count[j]; } } } maxn=Math.max(maxn,len[i]); } int res=0; for(int i=0;i<nums.length;i++) { if(len[i]==maxn) res+=count[i]; } return res; } }