LeetCode 673. Number of Longest Increasing Subsequence
阿新 • • 發佈:2018-12-06
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; } };