LeetCode673 最长递增子序列的个数

最长递增子序列的个数>>>
在这里插入图片描述

在leetcode300的基础上进行加强,求最长子序列的组合,添加个数组即可

package BDyNamicProgramming;

import DString.Problem3;

import java.util.Arrays;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/22 0022  14:55
 */
public class Problem673 {


    /**
     * 这道题和Problem300类似
     *  300要求求出最长递增子序列的长度
     *  这道题要求求出最长递增子序列长度对应的个数
     *  在求解的时候统计即可
     * @param nums
     * @return
     *
     */
    public int findNumberOfLIS(int[] nums) {


        if (nums.length == 0) {
            return 0;
        }

        int[] dp = new int[nums.length];
        int[] combination = new int[nums.length];

        Arrays.fill(dp, 1);
        Arrays.fill(combination, 1);

        //max为最长的长度
        int max = 1, res = 0;

        for (int i = 1; i < dp.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    if (dp[j] + 1 > dp[i]) { //如果+1长于当前LIS 则组合数不变
                        dp[i] = dp[j] + 1;
                        combination[i] = combination[j];
                    } else if (dp[j] + 1 == dp[i]) { //如果+1等于当前LIS 则说明找到了新组合
                        combination[i] += combination[j];
                    }
                }
            }
            //为何做场的长度
            max = Math.max(max, dp[i]);
        }

        for (int i = 0; i < nums.length; i++)
            if (dp[i] == max) res += combination[i];

        return res;

        }






    public static void main(String[] args) {
        int[] arr = {2,2,2,2,2};
        Problem673 problem673 = new Problem673();
       int size = problem673.findNumberOfLIS(arr);
        System.out.println(size);
    }


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值