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

举报
Code皮皮虾 发表于 2021/09/30 19:03:21 2021/09/30
【摘要】 【Code皮皮虾】求最长递增子序列的个数 不是长度哦(手动滑稽)!!!

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


💖最后

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。