LeetCode 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.

分析

这题和求最长不降子列类似,dp[i]记录以nums[i]结尾的最长子列长度,只需要另一个数组cnt,cnt[i]记录dp[i]对应的有几种,longest记录全程中最长子列长度,最后遍历dp数组,当dp[i]==longest时,count+=cnt[i].

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int count=0,longest=1;
        vector<int> dp(nums.size(),1),cnt(nums.size(),1);
        for(int i=1;i<nums.size();i++){
            for(int j=i-1;j>=0;j--){
                if(nums[i]>nums[j]){
                   if(dp[j]+1>dp[i]){
                      dp[i]=dp[j]+1;
                      cnt[i]=cnt[j];
                   }else if(dp[j]+1==dp[i])
                      cnt[i]+=cnt[j];
                }
            }
            longest=max(longest,dp[i]);
        }
        for(int i=0;i<nums.size();i++)
            if(dp[i]==longest) count+=cnt[i];
        return count;
    }
};
posted @ 2018-12-06 22:23  A-Little-Nut  阅读(119)  评论(0编辑  收藏  举报