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

最长递增子序列的个数

给定一个未排序的整数数组,找到最长递增子序列的个数。

示例 1:

输入: [1,3,5,4,7]

输出: 2

解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。

示例 2:

输入: [2,2,2,2,2]

输出: 5

解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。

注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。

思路

定义 dp(n,1) cnt (n,1)

这里我用dp[i]表示以nums[i]为结尾的递推序列的长度,用cnt[i]表示以nums[i]为结尾的递推序列的个数,初始化都赋值为1,只要有数字,那么至少都是1。然后我们遍历数组,对于每个遍历到的数字nums[i],我们再遍历其之前的所有数字nums[j],当nums[i]小于等于nums[j]时,不做任何处理,因为不是递增序列。反之,则判断dp[i]和dp[j]的关系,如果dp[i]等于dp[j] + 1,说明nums[i]这个数字可以加在以nums[j]结尾的递增序列后面,并且以nums[j]结尾的递增序列个数可以直接加到以nums[i]结尾的递增序列个数上。如果dp[i]小于dp[j] + 1,说明我们找到了一条长度更长的递增序列,那么我们此时奖dp[i]更新为dp[j]+1,并且原本的递增序列都不能用了,直接用cnt[j]来代替。维护一个全局最长的子序列长度mx,每次都进行更新,到最后遍历一遍每个节点,如果长度等于mx,res+=cnt[i];

 1 import java.util.Arrays;
 2
 3 class Solution {
 4     public int findNumberOfLIS(int[] nums) {
 5         int n=nums.length;
 6         int max_len=1;
 7         int res=0;
 8         int[] dp=new int[n];
 9         int[] cnt=new int[n];
10         Arrays.fill(dp,1);
11         Arrays.fill(cnt,1);
12         for(int i=1;i<n;i++){
13             for(int j=0;j<i;j++){
14                 if(nums[j]<nums[i]&&dp[j]+1>dp[i]){
15                     dp[i]=dp[j]+1;
16                     cnt[i]=cnt[j];
17                 }else if(nums[j]<nums[i]&&dp[j]+1==dp[i]){
18                     cnt[i]+=cnt[j];
19                 }
20             }
21             max_len=Math.max(max_len,dp[i]);
22         }
23         for(int i=0;i<n;i++){
24             if(dp[i]==max_len) res+=cnt[i];
25         }
26         return res;
27     }
28 }

原文地址:https://www.cnblogs.com/kexinxin/p/10400318.html

时间: 2024-08-30 06:39:40

Leetcode 673.最长递增子序列的个数的相关文章

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

题目: 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7].示例 2: 输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5.注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数. 解题: 方法:动态规划 假设对于以 nums[i] 结尾的序列,我们知道最长序列的长度 le

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

分析 * 假设对于以 nums[i] 结尾的序列,我们知道最长序列的长度 length[i],以及具有该长度的序列的 count[i]. * 对于每一个 j<i 和一个 nums[i]>nums[j],我们可以将一个 nums[i] 附加到以 nums[j] 结尾的最长子序列上. * 如果这些序列的长度 length[j]+1 > length[i],那么我们就知道现在有count[j]个这种长度(length[j]+1)的序列.如果这些序列的长度length[j]+1 == lengt

LeetCode 673. Number of Longest Increasing Subsequence 最长递增子序列的个数 (C++/Java)

题目: Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: Input: [1,3,5,4,7] Output: 2 Explanation: The two longest increasing subsequence are [1, 3, 4, 7] and [1, 3, 5, 7]. Example 2: Input: [2,2,2,2,2] O

Q673 最长递增子序列的个数

给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]. 示例 2: 输入: [2,2,2,2,2] 输出: 5 解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5. 注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数. class Solution { public int findNumberOfLIS(

Leetcode-673 (Number of Longest Increasing Subsequence)最长递增子序列的个数

1 #define _for(i,a,b) for(int i = (a);i < (b);i ++) 2 class Solution 3 { 4 public: 5 int findNumberOfLIS(vector<int>& nums) 6 { 7 int sz = nums.size(); 8 vector<pair<int,int>> dp (sz,{1,1});//LISlen times 9 10 int LISlen = 1; 11 f

HDU 3998 Sequence (最长递增子序列+最大流SAP,拆点法)经典

Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1666    Accepted Submission(s): 614 Problem Description There is a sequence X (i.e. x[1], x[2], ..., x[n]). We define increasing subsequ

leetcode最长递增子序列问题

题目描写叙述: 给定一个数组,删除最少的元素,保证剩下的元素是递增有序的. 分析: 题目的意思是删除最少的元素.保证剩下的元素是递增有序的,事实上换一种方式想,就是寻找最长的递增有序序列.解法有非常多种,这里考虑用动态规划实现. 开辟一个额外的一维数组dp[]用来记录以每一个元素为结尾的最长子序列的长度.当然.还须要一个哈希表,用来保存最长子序列的元素.dp[i]表示以数组A[i]为结尾的最长子序列的长度.则不难得到例如以下的公式: 然后通过回溯哈希表把须要删除的元素删除就可以. <span s

动态规划之最长递增子序列

题目一:给定一个长度为N的数组,找出一个最长的单调递增子序列(不一定连续,但是顺序不能乱).并返回单调递增子序列的长度. 例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},我们返回其长度6. 题目二:在题目一的基础上,我们要返回该子序列中的元素.例如,给定一个长度为8的数组A{1,3,5,2,4,6,7,8},我们返回的是单调递增子序列{1,2,4,6,7,8}. 解析:我们使用动态规划的思想来解决此问题,假设给定的数组为nu

LIS 最长递增子序列问题

一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm.求最大的m值. 比如int* inp = {9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}: 二,解决: 1.用一个临时数组tmp保存这样一种状态:tmp[i]表示以i为终点的递增序列的长度: 比如inp =