673. 最长递增子序列的个数
给定一个未排序的整数数组 nums
, 返回最长递增子序列的个数 。
class Solution {
public:
int findNumberOfLIS(vector& nums) {
int n=nums.size();
vectordp(n,1);
vectorf(n,1);
int retlength=1;
int retcount=1;
for(int i=1;if[i])
{
dp[i]=dp[j];
f[i]=f[j]+1;
}
}
}
if(retlength==f[i])retcount+=dp[i];
else if(retlength
646. 最长数对链
646. 最长数对链
题目描述:
给你一个由 n
个数对组成的数对数组 pairs
,其中 pairs[i] = [lefti, righti]
且 lefti < righti
。
现在,我们定义一种 跟随 关系,当且仅当 b < c
时,数对 p2 = [c, d]
才可以跟在 p1 = [a, b]
后面。我们用这种形式来构造 数对链 。
找出并返回能够形成的 最长数对链的长度 。
你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。![【算法挨揍日记】day31——673. 最长递增子序列的个数、646. 最长数对链_第2张图片](http://img.e-com-net.com/image/info8/2f1315335edb4349ba70d53b466e0732.jpg)
解题思路:
算法思路:
这道题⽬让我们在数对数组中挑选出来⼀些数对,组成⼀个呈现上升形态的最⻓的数对链。像不像
我们整数数组中挑选⼀些数,让这些数组成⼀个最⻓的上升序列?因此,我们可以把问题转化成我
们学过的⼀个模型: 300. 最⻓递增⼦序列 。因此我们解决问题的⽅向,应该在「最⻓递增⼦序
列」这个模型上。
不过,与整形数组有所区别。在⽤动态规划结局问题之前,应该先把数组排个序。因为我们在计
算 dp[i] 的时候,要知道所有左区间⽐ pairs[i] 的左区间⼩的链对。排完序之后,只⽤
「往前遍历⼀遍」即可。
1. 状态表⽰:
dp[i] 表⽰以 i 位置的数对为结尾时,最⻓数对链的⻓度。
2. 状态转移⽅程:
对于 dp[i] ,遍历所有 [0, i - 1] 区间内数对⽤ j 表⽰下标,找出所有满⾜ pairs[j]
[1] < pairs[i][0] 的 j 。找出⾥⾯最⼤的 dp[j] ,然后加上 1 ,就是以 i 位置为结
尾的最⻓数对链。
3. 初始化:
刚开始的时候,全部初始化为 1 。
4. 填表顺序:
根据「状态转移⽅程」,填表顺序应该是「从左往右」。
5. 返回值:
根据「状态表⽰」,返回整个 dp 表中的最⼤值。
解题代码:
class Solution {
public:
int findLongestChain(vector>& pairs) {
sort(pairs.begin(),pairs.end());
int n=pairs.size();
vectordp(n,1);
for(int i=1;i
你可能感兴趣的:(算法挨揍日记,Leetcode,算法,数据结构,leetcode)