Code皮皮虾求最长递增子序列的个数 不是长度哦(手动滑稽)!!!
Posted Code皮皮虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Code皮皮虾求最长递增子序列的个数 不是长度哦(手动滑稽)!!!相关的知识,希望对你有一定的参考价值。
文章目录
Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长,让我们一起加油努力叭🌈
😉毛遂自荐
毛遂自荐一下,给大家推荐一下自己的专栏😁,欢迎小伙伴们收藏关注😊
✨题目
🤣题外话
本题是求最长递增子序列的个数,而不是最长递增子序列的长度,不会有小伙伴上来就给我摆出下面这个代码的叭!不会吧不会吧( ̄▽ ̄)
别问我是怎么知道的(手动滑稽)
class Solution
public int lengthOfLIS(int[] nums)
int[] dp = new int[nums.length];
for(int i = 0;i < nums.length;i++)
dp[i] = 1;
int res = 1;
for(int i = 1;i < nums.length;i++)
for(int j = 0;j < i;j++)
if(nums[j] < nums[i])
dp[i] = Math.max(dp[i],dp[j] + 1);
res = Math.max(res,dp[i]);
return res;
😉正经点,解题思路
本题要的是,最长递增子序列的个数,那么我们得知道最长是多少,才能再去求最长得序列个数是多少!
利用动态规划,设置int[] dp = new int[nums.length];数组记录长度
,设置int[] counts = new int[nums.length];记录个数
那么状态如何转移呢❔
如果有熟悉 300.最长子序列的小伙伴可能知道,我也不废话
因为要递增,所以⏬
当j < i && nums[j] < nums[i]的时候,就需要去判断当前 dp[j] + 1 > dp[i],
如果为true,说明:dp[j]是不能接在dp[i]前面,递增序列有更大的长度,那么需要更新长度,既然有更大的长度,那么 counts[i] = counts[j],因为count[i]所以记录的个数已经无效了
但如果dp[j] + 1 == dp[i],说明dp[j]是可以接在dp[i]前面的,所以要 counts[i] += counts[j];
🌈代码实现
class Solution
public int findNumberOfLIS(int[] nums)
int len = nums.length;
if (len <= 1) return len;
int[] dp = new int[len];
int[] counts = new int[len];
//至少长度为1
Arrays.fill(counts, 1);
int maxLen = 0;
for (int i = 0; i < len; i++)
for (int j = 0; j < i; j++)
if (nums[j] < nums[i])
if (dp[j] + 1 > dp[i])
dp[i] = dp[j] + 1;
counts[i] = counts[j];
else if (dp[j] + 1 == dp[i])
counts[i] += counts[j];
maxLen = Math.max(maxLen,dp[i]);
//通过比较maxLen,来进行个数的增加
int res = 0;
for (int i = 0; i < len; ++i)
if (dp[i] == maxLen)
res += counts[i];
return res;
💖最后
我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!
创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见~~~
公众号干货内容输出,囊括Java、Python爬虫、力扣题解、大厂面试题 四大系列,更有长时间总结的干货资源分享,后台回复:面试资料即可领取
最后,祝各位步步高升🚀🚀🚀
粉丝福利👇🏻👇🏻👇🏻
以上是关于Code皮皮虾求最长递增子序列的个数 不是长度哦(手动滑稽)!!!的主要内容,如果未能解决你的问题,请参考以下文章
2021-11-16:最长递增子序列的个数。给定一个未排序的整数数组,找到最长递增子序列的个数。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。力扣673。