【DFS】个人练习-Leetcode-646. Maximum Length of Pair Chain

news/2024/11/30 12:51:58/

题目链接:https://leetcode.cn/problems/maximum-length-of-pair-chain/description/

题目大意:给出一系列区间pairs[][],如果某两个区间[a, b], [c, d]满足b < c,这两个区间就可以串起来[a, b] -> [c, d]。求能够串起来的区间的最大长度。

思路:看起来就很适合用DFS做的题。刚开始还想着用一个二维数组存区间之间的连接关系,后来发现,如果按照左端点排序的话,那么这些区间有两个特点

  1. 明显pair[i]只能连接pair[j], j > i。也就是一个区间只可能连接后面的区间。
  2. 如果区间pair[i]能够连接到pair[j],那么所有后面的k >= j的区间也都能被pair[i]连接。

因此,对每个区间,我们首先找到最近的下一个能连接的区间(因为这样才能让串起来的区间最长),存在min_next[]里。

		for (int i = 0; i < n; i++) {for (int j = i+1; j < n; j++) {if (pairs[i][1] < pairs[j][0]) {min_next[i] = j;break;}    }}

随后DFS,cnt表示加入了pair[idx]以后串当前暂时的长度。tmp用来存如果当前串接了后续的区间后最长的之后的串长。因此返回的是tmp。另外,我们把以i开头的串的最长长度存在longest[i]中,需要时直接取,不用再DFS到底一次。

	int DFS(int idx, int cnt) {cnt++;int tmp = cnt;for (int j = min_next[idx]; j < n; j++) {if (longest[j] != 0)tmp = max(tmp, 1+longest[j]);elsetmp = max(tmp, DFS(j, cnt));}return tmp;}

但是我们发现,因为最后的区间必然是不可能连接到其他区间的,而其他靠后的区间也更少可能连接到后面的区间,因此实际上如果从后往前遍历的话,所有的longest[i]都可以正确顺利地求出来,也就不用什么DFS了(或者说相当于从搜索树的底部往上爬)

		for (int i = n-1; i >= 0; i--) {int tmp = 0;for (int j = min_next[i]; j < n; j++)tmp = max(tmp, longest[j]);longest[i] = 1 + tmp;}

完整代码

class Solution {
public:int findLongestChain(vector<vector<int>>& pairs) {sort(pairs.begin(), pairs.end(), [&](vector<int>& x, vector<int>& y) -> bool {if (x[0] != y[0])return x[0] < y[0];elsereturn x[1] < y[1];});int n = pairs.size();vector<int> min_next(n, 1001);vector<int> longest(n, 1); for (int i = 0; i < n; i++) {for (int j = i+1; j < n; j++) {if (pairs[i][1] < pairs[j][0]) {min_next[i] = j;break;}    }}for (int i = n-1; i >= 0; i--) {int tmp = 0;for (int j = min_next[i]; j < n; j++)tmp = max(tmp, longest[j]);longest[i] = 1 + tmp;}return *max_element(longest.begin(), longest.end());}
};

http://www.ppmy.cn/news/1551201.html

相关文章

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …

AI开发:逻辑回归 - 实战演练- 垃圾邮件的识别(一)

逻辑回归的概念和演示 逻辑回归&#xff08;Logistic Regression&#xff09;最常用于二分类问题&#xff0c;即目标变量&#xff08;标签&#xff09;只有两个类别的场景。它通过拟合一个S形的Sigmoid函数来预测一个事件发生的概率&#xff0c;输出值在0到1之间&#xff0c;可…

云计算虚拟化-kvm-无损扩容磁盘分区

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 虚拟化&#xff0c;简单来说就是把一台服务器/PC电脑&#xff0c;虚拟成多台独立的虚拟机&#xff0c;每台虚拟机之间相互隔…

嵌入式开发调试优化:使用 Python 脚本提升效率

嵌入式开发是一项复杂且具有挑战性的工作&#xff0c;尤其是在调试过程中&#xff0c;开发者需要面对各种硬件与软件的交互问题。为了有效提高调试效率&#xff0c;使用自动化工具和脚本可以大大简化流程。在这篇文章中&#xff0c;我将分享几种常见的 Python 脚本&#xff0c;…

基础入门-Web应用架构搭建域名源码站库分离MVC模型解析受限对应路径

知识点&#xff1a; 1、基础入门-Web应用-域名上的技术要点 2、基础入门-Web应用-源码上的技术要点 3、基础入门-Web应用-数据上的技术要点 4、基础入门-Web应用-解析上的技术要点 5、基础入门-Web应用-平台上的技术要点 一、演示案例-域名差异-主站&分站&端口站&…

Git 使用总结

下载 git bash&#xff1a;http://git-scm.com/download/win 从github仓库中下载项目到本地&#xff1a;git clone 项目网址&#xff0c;得到一个文件夹 … 修改文件 … 修改完成后&#xff0c;进行上传的过程&#xff1a; 文件夹右键通过 git bash 进入 初始化&#xff1a;g…

Springboot组合SpringSecurity安全插件基于密码的验证Demo

Springboot组合SpringSecurity安全插件基于密码的验证Demo!下面的案例&#xff0c;都是基于数据库mysql&#xff0c;用户密码&#xff0c;验证登录的策略demo。 1&#xff1b;引入maven仓库的坐标 <dependency><groupId>org.springframework.boot</groupId>…

com.alibaba.fastjson.JSONException: not close json text, token : error

今天遇到一个相当智障的问题&#xff0c;前端传参数到后端&#xff0c;后端直接报json解析错误&#xff0c;not close&#xff1f;&#xff1f; 听着就很奇怪&#xff0c;关键有的时候正常&#xff0c;有的时候不正常。于是先在浏览器中F12&#xff0c;看传的参数 感觉 没问题&…