646. 最长数对链——【Leetcode每日刷题】

news2024/11/27 11:53:27

646. 最长数对链

给你一个由 n 个数对组成的数对数组 pairs ,其中 p a i r s [ i ] = [ l e f t i , r i g h t i ] pairs[i] = [left_i, right_i] pairs[i]=[lefti,righti] l e f t i < r i g h t i left_i < right_i lefti<righti

现在,我们定义一种 跟随 关系,当且仅当 b < c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链

找出并返回能够形成的 最长数对链的长度

你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

示例 1:

输入:pairs = [[1,2], [2,3], [3,4]]
输出:2
解释:最长的数对链是 [1,2] -> [3,4] 。

示例 2:

输入:pairs = [[1,2],[7,8],[4,5]]
输出:3
解释:最长的数对链是 [1,2] -> [4,5] -> [7,8] 。

提示:

  • n = = p a i r s . l e n g t h n == pairs.length n==pairs.length
  • 1 < = n < = 1000 1 <= n <= 1000 1<=n<=1000
  • − 1000 < = l e f t i < r i g h t i < = 1000 -1000 <= left_i < right_i <= 1000 1000<=lefti<righti<=1000

思路:

首先对二维数组进行排序:

  • 使用Arrays.sort(arr,Comparator<>)
    对数组中相邻的两个数进行比较, 一轮完了接着二轮 是一个冒泡排序,时间复杂度为: O ( n 2 ) O(n^2) O(n2)

(a, b) -> a - b 相当于
function(a,b){
return a-b;
}
Arrays.sort(arr, (a, b) -> a - b) 是对数组进行冒泡排序
如果 a - b>0 则b 在前 a 在后、直到有序
二维数组
Arrays.sort(arr, (a, b) ->(a[clomun]- b[clomun]))
以行为整体 按指定列比较

  • 使用快排,时间复杂度为:O(nlogn)

法一:动态规划

  1. 排序(按上述两种方法)
  2. 定义 dp[i] 为以 pairs[i] 为结尾的最长数对链的长度。
  3. 计算 dp[i] 时,可以先找出所有的满足 pairs[i][0] > pairs[j][1] 的 j,并求出最大的
    dp[j],dp[i]的值即可赋为这个最大值再加一。

法二:贪心

使用贪心思想扩展数对链,在所有可作为下一个数对的集合中选择第二个数最小的数对添加到数对链。

要挑选最长数对链的第一个数对时,最优的选择是挑选第二个数字最小的,这样能给挑选后续的数对留下更多的空间。挑完第一个数对后,要挑第二个数对时,也是按照相同的思路,是在剩下的数对中,第一个数字满足题意的条件下,挑选第二个数字最小的。按照这样的思路,可以先将输入按照第二个数字排序,然后不停地判断第一个数字是否能满足大于前一个数对的第二个数字即可。

  1. 排序(按上述两种方法)
  2. 由于所有的数对都已按照第一个升序排序,所以在构造数对链过程中,只需挑选数对第二数尽量小的数。使用temp0,temp1 记录数对链的最后一组数据。
  3. 对任意pairs[i - 1][0] <= pairs[i][0],所以 temp0 <= pairs[i][0]
    • 如果 pairs[i][0] > temp1 ,添加到数对链中,长度加1
    • 如果 pairs[i][1] < temp1 , 可以使数对链最后一个数对的第二个数更小,则替换最后一个数对
    • 其他的都跳过.

代码:(Java)

快排函数:

private static void quicksort(int[][] pairs, int left, int right) {//快排
		// TODO Auto-generated method stub
		int i = left, j = right;
		if(i >= j)
			return;
		int temp1 = pairs[i][0], temp2 = pairs[i][1];
		int a, b;
		while(i != j) {
			while(pairs[j][0] >= temp1 && i < j) {
				j--;
			}
			while(pairs[i][0] <= temp1 && i < j) {
				i++;
			}
			
			if(i < j) {
				a = pairs[i][0];
				b = pairs[i][1];
				pairs[i][0] = pairs[j][0];
				pairs[i][1] = pairs[j][1];
				pairs[j][0] = a;
				pairs[j][1] = b;
			}
			
		}
		pairs[left][0] = pairs[i][0];
		pairs[left][1] = pairs[i][1];
		pairs[i][0] = temp1;
		pairs[i][1] = temp2;
		
		quicksort(pairs, left, i-1);
		quicksort(pairs, i+1, right);
		return;
		
	}
}

法一:动态规划

import java.util.Arrays;

public class FindLongestChain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] pairs = {{1,2}, {7,8}, {4,5}};
		System.out.println(findLongestChain(pairs));
	}
	
	public static int findLongestChain(int[][] pairs) {
		int n = pairs.length;
		//Arrays.sort(pairs, (a,b)->(a[0] - b[0]));//冒泡排序
		quicksort(pairs, 0, n-1);
		
		int[] dp = new int[n];
		Arrays.fill(dp, 1);
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < i; j++) {
				if(pairs[i][0] > pairs[j][1]) {
					dp[i] = Math.max(dp[i], dp[j] + 1);
				}
			}
		}
		return dp[n - 1];
	}

法二:贪心

import java.util.Arrays;

public class FindLongestChain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] pairs = {{1,2}, {7,8}, {4,5}};
		System.out.println(findLongestChain(pairs));
	}
	
	public static int findLongestChain(int[][] pairs) {
		int n = pairs.length;
		//Arrays.sort(pairs, (a,b)->(a[0] - b[0]));//冒泡排序
		quicksort(pairs, 0, n-1);
		
		int len = 1;
		int temp0 = pairs[0][0], temp1 = pairs[0][1];
		for(int i = 1; i < n; i++) {
			if(pairs[i][0] > temp1) {
				len ++;
				temp0 = pairs[i][0];
				temp1 = pairs[i][1];
			}else if(pairs[i][1] < temp1 ) {
				temp0 = pairs[i][0];
				temp1 = pairs[i][1];
			}else {
				continue;
			}
		}
		
		return len;
	}
	

运行结果:

在这里插入图片描述
力扣提交:
在这里插入图片描述

复杂度分析

法一:动态规划

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n 为 pairs 的长度。排序的时间复杂度为 O(nlog⁡n),两层 for 循环的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

  • 空间复杂度:O(n),数组 dp的空间复杂度为 O(n)。

法二:贪心

  • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn),其中 n 为 pairs 的长度。排序的时间复杂度为 O(nlog⁡n)。

  • 空间复杂度:O(1)。

注:仅供学习参考!

题目来源:力扣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL查询索引原则

文章目录 等值匹配原则最左前缀匹配原则范围查找规则等值匹配+范围查找Order By + limit 优化分组查询优化总结MySQL 是如何帮我们维护非主键索引的等值匹配原则 我们现在已经知道了如果是【主键索引】,在插入数据的时候是根据主键的顺序依次往后排列的,一个数据页不够就会分…

保姆级使用PyTorch训练与评估自己的MobileViT网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址&#xff1a;https://github.com/Fafa-DL/Awesome-Backbones 操作教程&#xff1a;https://www.bilibili.co…

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

去年公司由于不断发展&#xff0c;内部自研系统越来越多&#xff0c;所以后来搭建了一个日志收集平台&#xff0c;并将日志收集功能以二方包形式引入自研系统&#xff0c;避免每个自研系统都要建立一套自己的日志模块&#xff0c;节约了开发时间&#xff0c;管理起来也更加容易…

【UE4 RTS游戏】07-控件蓝图显示当前游戏时间

效果步骤新建一个文件夹&#xff0c;命名为“Interfaces”&#xff0c;在该文件夹内新建一个蓝图接口&#xff0c;命名为“I_HUD”打开“Interfaces”&#xff0c;默认的函数名改为“SetClock”&#xff0c;添加一个输入&#xff0c;命名为“Time”&#xff0c;整数数组类型。添…

一套Java语言的云HIS医院信息管理系统SaaS源码

这是一套优秀的云His医院管理系统&#xff0c;它区别于普通的HIS系统&#xff0c;它通过云端管理整个HIS业务 一、HIS使用技术框架&#xff1a;自主研发&#xff0c;系统完全开源。 1、前端&#xff1a;AngularNginx 2、后台&#xff1a;JavaSpring&#xff0c;SpringBoot&…

AidLux AI 应用案例悬赏选题|行车安全辅助

AidLux AI 应用案例悬赏征集活动 AidLux AI 应用案例悬赏征集活动是AidLux推出的AI应用案例项目合作模式&#xff0c;悬赏选题将会持续更新。目前上新的选题涉及泛边缘、机器人、工业检测、车载等领域&#xff0c;内容涵盖智慧零售、智慧社区、智慧交通、智慧农业、智能家居等…

YOLOv5中添加SE模块详解——原理+代码

目录一、SENet1. 设计原理2. SE Block2.1 Squeeze:Global Information Embedding2.2 Excitation:Adaptive Recalibration3. SE-Inception and SE-ResNet二、YOLOv5中添加SENet1.修改common.py2.修改yolo.py3.修改yolov5s.yaml参考文章一、SENet 论文地址&#xff1a;Squeeze-a…

UI设计 ,这7个网站,真的太好用了。

下面这几个UI设计网站&#xff0c;设计师们一定要收藏起来&#xff0c;每天坚持浏览这些网站&#xff0c;可以快速的提升你的UI设计水平。 1、菜鸟图库 https://www.sucai999.com/searchlist/UIsheji----all-0-0.html?vNTYxMjky 菜鸟图库提供了超多免费设计素材&#xff0c;在…

logistic回归的参数梯度更新方法的个人理解

logistic回归参数更新看了几篇博文&#xff0c;感觉理解不透彻&#xff0c;所以自己写一下&#xff0c;希望能有更深的理解。logistic回归输入是一个线性函数Wxb\boldsymbol{W}\boldsymbol{x}\boldsymbol{b}Wxb&#xff0c;为了简单理解&#xff0c;考虑batchsize为1的情况。这…

ChatGPT的影响力和未来发展

ChatGPT是一种基于深度学习的自然语言处理技术&#xff0c;它是由OpenAI开发的一种语言模型。ChatGPT作为一个大型语言模型&#xff0c;可以在很多方面对程序职业产生影响。值得注意的是&#xff0c;ChatGPT和其他语言模型一样&#xff0c;只是一种技术工具&#xff0c;它的应用…

Postman 接口传参报错解决与@RequestBody的注解作用记录

文章目录前言一、接口代码1.1 代码说明1.2 测试结果1.3 问题解决1.4 RequestBody 作用前言 记录接口传参报错与解决和RequestBody的作用记录 一、接口代码 1.1 代码说明 以下面测试代码作为例子&#xff1a;前端发送 POST 请求&#xff0c;请求体里面携带 List 集合的字符串…

C++回顾(十九)—— 容器string

19.1 string概述 1、string是STL的字符串类型&#xff0c;通常用来表示字符串。而在使用string之前&#xff0c;字符串通常是 用char * 表示的。string 与char * 都可以用来表示字符串&#xff0c;那么二者有什么区别呢。 2、string和 char * 的比较 &#xff08;1&#xff09…

【wed前端初级课程】第一章 什么是HTML

什么是WEB前端&#xff1f; 简单来说就是网页&#xff0c;只是这个网页它是由多种技术参与制作的&#xff0c;用来向用户展示的页面。 HTML(超文本标签语言)&#xff1a;它决定了网页的结构。 CSS&#xff1a;网页的装饰器。 JavaScript&#xff1a;JavaScrip最初是因为校验…

【Linux系统编程】06:共享内存

共享内存 OVERVIEW共享内存一、文件上锁flock二、共享内存1.关联共享内存ftok2.获取共享内存shmget3.绑定共享内存shmat4.绑定分离shmdt5.控制共享内存shmctl三、亲缘进程间通信1.共享内存写入与读取2.共享内存解绑与删除3.共享内存综合四、非亲缘进程间通信1.通过sleep同步2.通…

Android 进阶——Binder IPC之Native 服务的启动及代理对象的获取详解(六)

文章大纲引言一、Binder线程池的启动1、ProcessState#startThreadPool函数来启动线程池2、IPCThreadState#joinThreadPool 将当前线程进入到线程池中去等待和处理IPC请求二、Service 代理对象的获取1、获取Service Manager 代理对象BpServiceManager2、调用BpServiceManager#ge…

【算法数据结构体系篇class16】:图 拓扑排序

一、图1&#xff09;由点的集合和边的集合构成2&#xff09;虽然存在有向图和无向图的概念&#xff0c;但实际上都可以用有向图来表达3&#xff09;边上可能带有权值二、图结构的表达1&#xff09;邻接表法 类似哈希表, key就是当前节点。value就是对应有指向的邻接节点2&…

LeetCode——1590. 使数组和能被 P 整除

一、题目 给你一个正整数数组 nums&#xff0c;请你移除 最短 子数组&#xff08;可以为 空&#xff09;&#xff0c;使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。 请你返回你需要移除的最短子数组的长度&#xff0c;如果无法满足题目要求&#xff0c;返回 -1…

PostgreSQL 数据库大小写规则

PostgreSQL 数据库对大小写的处理规则如下&#xff1a; 严格区分大小写默认把所有 SQL 语句都转换成小写再执行加双引号的 SQL 语句除外 如果想要成功执行名称中带有大写字母的对象&#xff0c;则需要把对象名称加上双引号。 验证如下&#xff1a; 想要创建数据库 IZone&…

Windows WSL配置ubuntu环境并登录

一、Windows WSL配置ubuntu环境1、管理员运行cmd&#xff0c;执行以下命令启用“适用于 Linux 的 Windows 子系统”dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart2、管理员运行cmd&#xff0c;执行以下命令启用“虚拟机功…

浅谈ChatGPT

ChatGPT概述 ChatGPT是一种自然语言处理模型&#xff0c;ChatGPT全称Chat Generative Pre-trained Transformer&#xff0c;由OpenAI开发。它使用了基于Transformer的神经网络架构&#xff0c;可以理解和生成自然语言文本。ChatGPT是当前最强大和最先进的预训练语言模型之一&a…