673. Number of Longest Increasing Subsequence

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;
    }
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325935245&siteId=291194637