1. 程式人生 > >LeetCode 673. Number of Longest Increasing Subsequence

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