【Code皮皮虾】求最长递增子序列的个数 不是长度哦(手动滑稽)!!!

Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长,让我们一起加油努力叭🌈

👉话不多说,直达底部有粉丝专享福利!!!


😉毛遂自荐

毛遂自荐一下,给大家推荐一下自己的专栏😁,欢迎小伙伴们收藏关注😊

大厂面试题专栏

Java专栏

爬虫专栏

力扣刷题专栏

更多专栏尽在主页,点我😁!!!



✨题目

673. 最长递增子序列的个数

image.png



🤣题外话

本题是求最长递增子序列的个数,而不是最长递增子序列的长度,不会有小伙伴上来就给我摆出下面这个代码的叭!不会吧不会吧( ̄▽ ̄)


别问我是怎么知道的(手动滑稽)

300.最长子序列

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爬虫、力扣题解、大厂面试题 四大系列,更有长时间总结的干货资源分享,后台回复:面试资料即可领取


最后,祝各位步步高升🚀🚀🚀

                                                   粉丝福利👇🏻👇🏻👇🏻

  • 56
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值