给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。
注意 这个数列必须是 严格 递增的。
- class Solution {
- public:
- int findNumberOfLIS(vector<int>& nums) {
- int n=nums.size();
- vector<int>dp(n,1);
- vector<int>f(n,1);
- int retlength=1;
- int retcount=1;
- for(int i=1;i
- {
- //int length=f[0];//0到i-1区间内的最大长度
- for(int j=0;j
- {
- if(nums[j]
- {
- if(f[j]+1==f[i])dp[i]+=dp[j];
- else if(f[j]+1>f[i])
- {
- dp[i]=dp[j];
- f[i]=f[j]+1;
- }
- }
- }
- if(retlength==f[i])retcount+=dp[i];
- else if(retlength
- {
- retcount=dp[i];
- retlength=f[i];
- }
- }
-
- return retcount;
- }
- };
646. 最长数对链
题目描述:
给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti < righti 。
现在,我们定义一种 跟随 关系,当且仅当 b < c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链 。
找出并返回能够形成的 最长数对链的长度 。
你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。
解题思路:
算法思路:
这道题⽬让我们在数对数组中挑选出来⼀些数对,组成⼀个呈现上升形态的最⻓的数对链。像不像
我们整数数组中挑选⼀些数,让这些数组成⼀个最⻓的上升序列?因此,我们可以把问题转化成我
们学过的⼀个模型:
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
int >>& pairs) { - sort(pairs.begin(),pairs.end());
- int n=pairs.size();
- vector<int>dp(n,1);
- for(int i=1;i
- {
- for(int j=0;j
- {
- if(pairs[j][1]
0]) - dp[i]=max(dp[i],dp[j]+1);
- }
- }
- int ret=1;
- for(int i=0;i
- ret=max(ret,dp[i]);
- return ret;
- }
- };
-
相关阅读:
学习笔记-FRIDA脚本系列(二)
python--本地时间转UTC时间
RT-Thread 组件学习
【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)
力扣287. 寻找重复数
ARM汇编之程序状态寄存器传输指令
动力节点最新Redis7笔记-Redis概述
kubernetes中Pod调度-Taints污点和污点容忍
前端UI工具(主要适用于JAVa,layui+easyui+elementui等及UI对比)
基于opengauss数据库的酒水销售管理系统
-
原文地址:https://blog.csdn.net/m0_69061857/article/details/134468115