2020年9月23日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
1. DP
本题的DP
解法需要在 LeetCode 300. 最长递增子序列(动态规划,贪心+二分)DP
解法的基础上进行修改,新增数组cnt
,cnts[i]
表示以位置 i
结尾的最长递增子序列的个数。
如果nums[i]
大于nums[j]
,由lens[i]
(表示位置i
处的最长递增子序列的长度)和lens[j]+1
的大小,判断位置i
是否是第一次遇到最长子序列,如果是的话(lens[i]<lens[j]+1
),当前最长子序列的个数cnts[i]
就等于cnts[j]
;否则就代表已经遇到过最长子序列了,cnts[i]
就等于自身的值加上cnts[j]
。
两次循环结束后,求最长递增子序列的长度,然后把拥有最长长度的次数加起来即为所求。
class Solution {
public:
int findNumberOfLIS(vector<int>& nums) {
int n = nums.size();
if(n<2) return n;
vector<int>