【算法与数据结构】406、LeetCode根据身高重建队列

news2025/2/6 19:40:32

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:本题难点在于如何对序列进行排序,以及保证序列的顺序(符合题目要求的顺序)。排序有两种一种是对K进行排序,排完之后发现队列仍然混乱,没有意义。按身高排序以后发现队列有序,同时我们按题目要求,K更大的元素方在后面。例如,people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]], 排序后为[[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]],排序使用sort函数的重载。然后使用链表进行插入,链表插入的效率相较于vector容器高很多(参考代码随想录)。关于链表的插入可以看博主的文章【算法与数据结构】707、LeetCode设计链表。最后按题目的要求返回链表(不是链表头,是一个vector<vector>的嵌套vector容器)。
  程序如下

class Solution {
public:
	static bool cmp(const vector<int>& a, const vector<int>& b) {
		if (a[0] == b[0]) return a[1] < b[1];	// 如果h相同比较k,k比较大的放后面,升序
		return a[0] > b[0];	// 按h排列,降序
	}
	//vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
	//	sort(people.begin(), people.end(), cmp);
	//	vector<vector<int>> que;
	//	for (int i = 0; i < people.size(); i++) {
	//		int position = people[i][1];
	//		que.insert(que.begin() + position, people[i]);
	//	}
	//	return que;
	//}
	vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
		sort(people.begin(), people.end(), cmp);	// 底层用链表实现,效率比vector高很多
		list<vector<int>> que;
		for (int i = 0; i < people.size(); i++) {
			int position = people[i][1];
			list<vector<int>>::iterator it = que.begin();
			while (position--) {	// 寻找插入位置
				it++;
			}
			que.insert(it, people[i]);
		} 
		return vector<vector<int>>(que.begin(), que.end());
	}
};  

复杂度分析:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

# include <iostream>
# include <vector>
# include <list>
# include <algorithm>
using namespace std;

class Solution {
public:
	static bool cmp(const vector<int>& a, const vector<int>& b) {
		if (a[0] == b[0]) return a[1] < b[1];	// 如果h相同比较k,k比较大的放后面,升序
		return a[0] > b[0];	// 按h排列,降序
	}
	//vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
	//	sort(people.begin(), people.end(), cmp);
	//	vector<vector<int>> que;
	//	for (int i = 0; i < people.size(); i++) {
	//		int position = people[i][1];
	//		que.insert(que.begin() + position, people[i]);
	//	}
	//	return que;
	//}
	vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
		sort(people.begin(), people.end(), cmp);	// 底层用链表实现,效率比vector高很多
		list<vector<int>> que;
		for (int i = 0; i < people.size(); i++) {
			int position = people[i][1];
			list<vector<int>>::iterator it = que.begin();
			while (position--) {	// 寻找插入位置
				it++;
			}
			que.insert(it, people[i]);
		} 
		return vector<vector<int>>(que.begin(), que.end());
	}
};  

int main() {
	Solution s1;
	vector<vector<int>> people = { {7, 0}, {4, 4}, {7, 1}, {5, 0}, {6, 1}, {5, 2} };
	vector<vector<int>> result = s1.reconstructQueue(people);
	//vector<vector<int>> result = people; 
	for (vector<vector<int>>::iterator it = result.begin(); it != result.end(); it++) {
		for (vector<int>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {
			cout << *jt << " ";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

end

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

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

相关文章

中间件系列 - Redis入门到实战(高级篇-分布式缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 Redis持久化Redis主从Redis哨兵Redis分片集群 一 分…

如何进行实例监控

目录 行实例监控 云监控 云监控核心功能 云监控ECS实例 安装插件 查看监控图表 云监控控制台 云服务器ECS控制台 设置报警规则 行实例监控 方式一&#xff1a;在服务器上自行编写并定时运行&#xff08;计划任务&#xff09;监控脚本&#xff08;shell、python&#x…

Neo4j 5.15 windows安装

1&#xff0c;什么是图数据库&#xff1f; 着社交、电商、金融、互联网那个等快速发展&#xff0c;现实社会织起了一张庞大复杂的关系网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系呈集合 数级增长&#xff0c;急需一种支持海量复杂数据关系…

【MYSQL】MYSQL 的学习教程(九)之 23 个 SQL 优化小技巧

这篇文章从 15 个方面&#xff0c;分享了 sql 优化的一些小技巧&#xff0c;希望对你有所帮助 目录 1. 避免使用 select *&#xff0c;务必指明字段名称2. 用 union all 代替 union3. 小表驱动大表4. 批量操作5. 当只需要一条数据的时候&#xff0c;使用limit 16. IN 包含的值不…

Windows配置C语言环境(超级详细)

Windows配置C语言环境 1.安装C编译器&#xff08;MinGW-W64 GCC&#xff09;1.1点击安装1.2将压缩包解压到相应目录1.3把mingw添加进系统的环境变量1.4测试 2安装并配置Visual Studio Code2.1下载VSCode2.2“Code Runner”扩展的配置 3.编写C语言 各位小伙伴想要博客相关资料的…

初识Nginx默认配置文件

说起配置Nginx确实是一件让人头疼的事&#xff0c;开始时对Nginx配置不熟悉&#xff0c;为了满足需求在网上查找了很多相关配置的博客&#xff0c;也是天花乱坠不知道谁对谁错。就不停反复尝试最终在不懈的努力下中终于成功了。那时就觉得是时候好好整理一下Nginx的相关配置了。…

【MIMO 从入门到精通】[P6]【What is Beamforming?】

前言&#xff1a; Beamforming 是MIMO 技术里面的核心技术之一&#xff0c;所以讲MIMO 必须对Beamforming 有所了解&#xff0c;本篇主要了解一下beamforming Explains how a beam is formed by adding delays to antenna elements. 波束赋形&#xff08;Beamforming&#xff…

【我与java的成长记】之面向对象的初步认识

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、什么是面向对象面向过程…

力扣刷题记录(18)LeetCode:474、518、377、322

目录 474. 一和零 518. 零钱兑换 II 377. 组合总和 Ⅳ 322. 零钱兑换 总结&#xff1a; 474. 一和零 这道题和前面的思路一样&#xff0c;就是需要将背包扩展到二维。 class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector&l…

tvbox最新接口配置

TVBox是在Github的开源项目&#xff0c;本身是一个空壳软件&#xff0c;可免费使用及再开发。安装后需要配置接口才能正常使用。 TVBox&#xff0c;也被称为网络电视盒子&#xff0c;是一种可以连接到电视的设备&#xff0c;使电视具有智能电视的功能。TVBox的主要功能是通过网…

mysql 26day 数据库双主双从 搭建mycat 数据库负载均衡 读写分离

目录 搭建一个(双主双从) &#xff08;然后搭建mycat&#xff09;四台主机配置master1 (主库1)master2 (主库2)slave 1(从库1)master1 (主库1)slave 1(从库1)如果配置出错 需要从这里从新配置 写入数据(测试)mycat安装java安装mycat编辑文件server.xml编辑文件schema.xml配置 m…

网站被恶意扫描怎么办(上WAF)

在网络安全领域&#xff0c;有一大类工具被广泛使用&#xff0c;且作用不可忽视&#xff0c;它就是网络安全扫描器。扫描器是一种专门设计用来评估计算机、网络或者应用中已知的弱点的计算机程序&#xff0c;但是很多人恶意使用&#xff0c;找到网站弱点进行攻击。 扫描器的种…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 &#xff0c;感觉大佬在矩阵转置那块介绍的还是有些简略&#xff0c;我自己又做了点动图加以补充理解。膜拜大佬&#xff01; Part A 先解决解析命令行参数的…

fpga verilog rs232 发送模块实现

RS-232是一种串行通信协议&#xff0c;用于在计算机和其他外部设备之间进行数据传输。RS-232定义了电气特性、信号级别、机械特性和传输速率等规范&#xff0c;为串行通信提供了一种标准化的接口。 RS-232通常使用DB9连接器&#xff0c;用于传输和接收数据、控制信号以及地线连…

VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…

小学班委有哪些职位

在成长的道路上&#xff0c;班委是一个不可或缺的角色。它不仅是一个职位&#xff0c;更是一份责任和担当。对于孩子们来说&#xff0c;成为班委不仅意味着荣誉&#xff0c;更意味着在集体中发挥自己的力量&#xff0c;为班级做贡献。 那么&#xff0c;小学班委有哪些职位呢&am…

小学班级管理方法和措施

开学了&#xff0c;宝贝们步入小学的大门&#xff0c;新环境、新同学、新起点。如何为孩子们营造一个和谐、有序的学习环境&#xff1f;这离不开我们班主任的精心管理。 制定明确的班规 教室里&#xff0c;同学们有秩序地坐着&#xff0c;这得益于我们班的班规。但班规不是摆设…

Java SPI 机制介绍和实战

目录 什么是 Java SPI Java SPI 原理 Java SPI 使用场景 1. 框架扩展与插件化 2. 服务加载与扩展 3. 组件化和模块化设计 4. 数据转换和格式化 5. 插件化应用程序 Java SPI 实战 步骤 1&#xff1a;定义服务接口 步骤 2&#xff1a;实现服务提供者 步骤 3&#xf…

UE5 C++(九)— 静态、动态加载类和资源

文章目录 前提静态加载类和资源静态加载资源静态加载类 动态加载类和资源动态资源动态加载类 前提 有必要说一下&#xff0c;静态这块内容加载时我用UE5.2版本出现调用静态资源不是显示问题&#xff0c;修改后容易崩。所以&#xff0c;这里不建议5.2版本&#xff0c;直接用5.3…