LeetCode 673 Number of Longest Increasing Subsequence
2022/8/13 6:23:25
本文主要是介绍LeetCode 673 Number of Longest Increasing Subsequence,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Given an integer array nums
, return the number of longest increasing subsequences.
Notice that the sequence has to be strictly increasing.
Solution
我们需要求出最长长度序列的个数。不妨用两个数组 \(dp1, dp2\). 其中 \(dp1[i]\) 表示以 \(i\) 结尾的最长递增序列的长度, \(dp2[i]\) 表示以 \(i\) 结尾的最长递增序列的个数。
对于转移,\(dp1[i]\) 和前面一题一样:
\[dp1[i] = dp1[j]+1, \text{if }nums[j]<nums[i] \]对于 \(dp2[i]\):
\[dp2[i]=dp2[j], \text{if }nums[j]<nums[i] \]因为此时添加在 \(j\) 的末尾时,答案不变(直接继承前面的)
如果当前的 \(dp[j]+1=dp[i]\), 说明此时可以添加答案:
\[dp2[i]=dp2[i]+dp2[j] \]点击查看代码
class Solution { private: int dp1[2002];// length of lis int dp2[2002];// num of lis public: int findNumberOfLIS(vector<int>& nums) { int n = nums.size(); for(int i=0;i<n;i++)dp1[i]=dp2[i]=1; for(int i=1;i<n;i++){ for(int j=0;j<i;j++){ if(nums[i]>nums[j]){ if(dp1[j]+1>dp1[i]){ dp1[i] = 1+dp1[j]; dp2[i] = dp2[j]; } else if(dp1[j]+1==dp1[i]){ dp2[i]+=dp2[j]; } } } } int maxv = 0; for(int i=0;i<n;i++)maxv=max(maxv,dp1[i]); int ans=0; for(int i=0;i<n;i++){ if(maxv==dp1[i])ans+=dp2[i]; } return ans; } };
这篇关于LeetCode 673 Number of Longest Increasing Subsequence的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享