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

254 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

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



✨题目

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;
    }
}


🔥精选专栏

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

力扣算法题解专区

小白学Java

MybatisPlus专栏

App爬虫专栏

PC端爬虫专栏

大厂面试题专栏

💖最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以==一键三连哦!==,感谢支持,我们下次再见~~~