【Leetcode笔记】406.根据身高重建队列
文章目录
- 1. 题目要求
- 2.解题思路
- 注意
- 3.ACM模式代码
1. 题目要求

2.解题思路
首先,按照每个人的身高属性(即people[i][0])来排队,顺序是从大到小降序排列,如果遇到同身高的,按照另一个属性(即people[i][1])来从小到大升序排列。
使用到C++的sort()函数,第三个参数cmp函数自己定义:
static bool cmp(const vector<int>& a, const vector<int>& b)
{
// 使用const关键字来确保在函数内部不会修改a和bif(a[0] == b[0]) return a[1] < b[1]; // 象形的记,升序return a[0] > b[0];
}
接下来再次遍历people数组,从前到后将每个元素放入到一个二维数组里。
为什么从前到后?
先排身高更高的,后面身高矮的即使因为第二个属性需要插入到前面人的中间去也没关系,反正身高更高的第二个属性不受影响。但是从后到前先排身高矮的可就不行了。
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;}
时间复杂度要大于O(nlogn + n ^ 2),首先C++里的sort函数的时间复杂度就是O(nlogn),这个排序函数内部并不是单一的快速排序或者是其他的,而是动态改变的,可能一开始数据量较大时先快速排序对半分,等分到后面则使用插入排序;C++的vector是一个动态数组,插入操作是先考虑原来的数组大小够不够,如果不够那就二倍扩容,然后把原数组拷贝到新数组再插入新的元素,所以时间复杂度要大于O(n^2)。
将数组改成链表:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort (people.begin(), people.end(), cmp);list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多for (int i = 0; i < people.size(); i++) {int position = people[i][1]; // 插入到下标为position的位置std::list<vector<int>>::iterator it = que.begin();while (position--) { // 寻找在插入位置it++;}que.insert(it, people[i]);}return vector<vector<int>>(que.begin(), que.end());
注意
sort函数的第三个参数是cmp,cmp是一个比较函数,想这样使用 sort (people.begin(), people.end(), cmp);那必须得将cmp声明为静态成员函数,这样就不需要将函数实例化了。
3.ACM模式代码
#include <vector>
#include <algorithm>
#include <list>
#include <iostream> // 用于输出调试using namespace std;class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {// Sort by height descending, and if heights are same, by k ascendingif (a[0] == b[0]) {return a[1] < b[1]; // Sort by k in ascending order} else {return a[0] > b[0]; // Sort by height in descending order}}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {// Sort people array using custom comparatorsort(people.begin(), people.end(), cmp);// Use list for efficient insertionlist<vector<int>> que;// Insert into list at the specified index (k value)for (int i = 0; i < people.size(); i++) {int position = people[i][1]; // k value tells us the exact index to insertauto it = que.begin();advance(it, position); // Move iterator to the correct positionque.insert(it, people[i]); // Insert person into the list}// Convert list back to vector for returning the resultreturn vector<vector<int>>(que.begin(), que.end());}
};int main() {Solution sol;// Example usage:vector<vector<int>> people = {{7,0}, {4,4}, {7,1}, {5,0}, {6,1}, {5,2}};vector<vector<int>> result = sol.reconstructQueue(people);// Print the resultcout << "[";for (const auto& person : result) {cout << "[" << person[0] << ", " << person[1] << "],";}cout << "]";cout << endl;return 0;
}
相关文章:
【Leetcode笔记】406.根据身高重建队列
文章目录 1. 题目要求2.解题思路 注意3.ACM模式代码 1. 题目要求 2.解题思路 首先,按照每个人的身高属性(即people[i][0])来排队,顺序是从大到小降序排列,如果遇到同身高的,按照另一个属性(即p…...
Linux 安装pdfjam (PDF文件尺寸调整)
跟Ghostscript搭配使用,这样就可以将不同尺寸的PDF调整到相同尺寸合并了。 在 CentOS 上安装 pdfjam 需要安装 TeX Live,因为 pdfjam 是基于 TeX Live 的。以下是详细的步骤来安装 pdfjam: ### 步骤 1: 安装 EPEL 仓库 首先,安…...
python+playwright 学习-90 and_ 和 or_ 定位
前言 playwright 从v1.34 版本以后支持and_ 和 or_ 定位 XPath 中的and和or xpath 语法中我们常用的有text()、contains() 、ends_with()、starts_with() //*[text()="文本"] //*[contains(@id, "xx")] //...
亲子时光里的打脸高手,贾乃亮与甜馨的父爱如山
贾乃亮这波操作,简直是“实力打脸”界的MVP啊! 7月5号,他一甩手,甩出张合照, 瞬间让多少猜测纷飞的小伙伴直呼:“脸疼不?”带着咱家小甜心甜馨, 回了哈尔滨老家,这趟亲…...
MySQL篇-SQL优化实战
SQL优化措施 通过我们日常开发的经验可以整理出以下高效SQL的守则 表主键使用自增长bigint加适当的表索引,需要强关联字段建表时就加好索引,常见的有更新时间,单号等字段减少子查询,能用表关联的方式就不用子查询,可…...
【MySQL备份】Percona XtraBackup总结篇
目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…...
【Git 】规范 Git 提交信息的工具 Commitizen
Commitizen是一个用于规范Git提交信息的工具,它旨在帮助开发者生成符合一定规范和风格的提交信息,从而提高代码维护的效率,便于追踪和定位问题。以下是对Commitizen的详细介绍。 1、Commitizen的作用与优势 规范提交信息:通过提供…...
ABB PPC902AE1013BHE010751R0101控制器 处理器 模块
ABB PPC902AE1013BHE010751R0101 该模块是用于自动化和控制系统的高性能可编程控制器。它旨在与其他自动化和控制设备一起使用,以提供完整的系统解决方案 是一种数字输入/输出模块,提供了高水平的性能和可靠性。它专为苛刻的工业应用而设计,…...
大模型AIGC转行记录(一)
自从22年11月chat gpt上线以来,这一轮的技术浪潮便变得不可收拾。我记得那年9月份先是在技术圈内讨论,然后迅速地,全社会在讨论,各个科技巨头、金融机构、政府部门快速跟进。 软件开发行业过去与现状 我19年决定转码的时候&…...
element-ui Tree之懒加载叶子节点强制设置父级半选效果
效果: 前言: 我们是先只展示一级的,二级的数据是通过点击之后通过服务器获取数据,并不是全量数据直接一起返回回来的。 问题: 当你设置了默认选中的子节点,但是由于刚进入页面此时tree中数据暂是没有这个…...
Java项目:基于SSM框架实现的高校共享单车管理系统分前后台【ssm+B/S架构+源码+数据库+开题报告+任务书+毕业论文】
一、项目简介 本项目是一套基于SSM框架实现的高校共享单车管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…...
【Android】自定义换肤框架02之自定义AssetManager和Resource
ResourceId是如何变成对应Resource的 在上一章中,我们已经讲过,apk中有个资源索引文件 其中保存了每个资源对应的id,name,type,path 资源文件的解析,主要涉及两个类,AssetManager和Resource …...
熵权法、熵值法、熵权TOPSIS三种方法的实用场景及优劣比较
在统计分析与决策分析中,熵权法、熵值法和熵权TOPSIS是三种常用的基于信息熵理论的方法。这些方法在处理多属性或多指标决策问题时,能够客观地反映数据的内在特性和各指标的相对重要性,为科学决策提供了有力支持。 熵权法 实用场景 熵权法是一种基于信息熵的客观赋权方法…...
无人机人员搜救
人员搜救-水域救援 水域搜救:快速水面搜查 物资抛投:救生物资抛投 绳索牵引:牵引救援绳索 领航船艇:水面侦察领航 人员搜救 昼夜搜救,精准定位 水域搜救 经纬 M300 RTK 搭载禅思 H20T 能够满足全天候作业需求&a…...
目标检测算法
讯飞星火 目标检测算法是计算机视觉领域的一项核心技术,用于在数字图像或视频中识别和定位一个或多个特定对象实例。这些算法通常需要确定对象的位置(例如通过边界框)和类别(例如人、汽车、狗等)。以下是一些流行的目…...
SpringSecurity 三更草堂学习笔记
0.简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比与Spring…...
鸿蒙生态应用开发白皮书V3.0
来源:华为: 近期历史回顾:...
CSS - 深入理解选择器的使用方式
CSS基本选择器 通配选择器元素选择器类选择器id 选择器 通配选择器 作用:可以选中所有HTML元素。语法: * {属性名;属性值; }举例: /* 选中所有元素 */ * {color: orange;font-size: 40px; }在清除样式方面有很大作用 元素选择器…...
动手学深度学习(Pytorch版)代码实践 -循环神经网络-54~55循环神经网络的从零开始实现和简洁实现
54循环神经网络的从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l import matplotlib.pyplot as plt import liliPytorch as lp# 读取H.G.Wells的时光机器数据集 batch_size, num_steps 32, …...
Python酷库之旅-第三方库Pandas(006)
目录 一、用法精讲 10、pandas.DataFrame.to_excel函数 10-1、语法 10-2、参数 10-3、功能 10-4、返回值 10-5、说明 10-6、用法 10-6-1、数据准备 10-6-2、代码示例 10-6-3、结果输出 11、pandas.ExcelFile类 11-1、语法 11-2、参数 11-3、功能 11-4、返回值 …...
GME-Qwen2-VL-2B实战:手把手教你构建个人多模态知识库
GME-Qwen2-VL-2B实战:手把手教你构建个人多模态知识库 1. 为什么需要多模态知识库? 在日常工作和生活中,我们积累了大量不同类型的数据——文档、图片、截图、笔记等。传统知识管理工具往往只能处理单一类型的数据,要么是纯文本…...
2026论文写作工具红黑榜:AI论文网站怎么选?这份榜单够用!
红榜优先选千笔AI、ThouPen、豆包,适配国内学术规范;黑榜避开低质免费工具、无真实引用平台、过度依赖全文生成的工具,优先按需求匹配三维模型(需求匹配度 - 数据可信度 - 成本承受力)。 一、红榜:10 款高分…...
Fillinger:设计自动化时代的效率提升工具
Fillinger:设计自动化时代的效率提升工具 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 核心价值:从机械操作到创意释放的设计革命 核心价值:让…...
避坑指南:CentOS7部署LibreNMS常见错误及解决方案
CentOS7部署LibreNMS避坑实战:从SELinux到数据库权限的深度排错指南 对于网络监控系统的部署,LibreNMS以其开源特性和强大功能成为众多技术团队的首选。但在CentOS7环境下,从系统配置到服务调优的每个环节都可能成为阻碍顺利部署的暗礁。本文…...
MXNet多语言生态:Python到Java/C++的跨平台部署
MXNet多语言生态:Python到Java/C的跨平台部署 文章详细介绍了MXNet深度学习框架的多语言支持能力,重点阐述了从Python训练环境到Java/C生产环境的完整部署流程。内容涵盖Python API的深度使用指南,包括NDArray高效张量计算、Symbolic编程的计…...
从零开始:OCAT图形化配置工具让OpenCore黑苹果安装变得简单
从零开始:OCAT图形化配置工具让OpenCore黑苹果安装变得简单 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools 还在为复杂的…...
别再只用Unity做游戏了!用Game4Automation PRO插件,手把手教你搭建一条虚拟生产线(附PLC连接避坑指南)
跨界开发者的工业仿真指南:用Unity打造虚拟生产线全流程 当游戏开发者遇上工业自动化,会碰撞出怎样的火花?Unity作为全球最流行的游戏引擎之一,早已突破了娱乐产业的边界。今天,我们将探索如何利用Game4Automation PRO…...
react二次封装
先在src下创建一个utils文件一次封装下载npm install axios在utils文件创建个request.jsimport axios from axios;// 创建axios实例 const instance axios.create({timeout: 10000,headers: {Content-Type: application/json},baseURL: https://zzgoodqc.cn/ });// 请求拦截器…...
Python离线环境搭建全攻略:从虚拟机到生产服务器的完整迁移方案
Python离线环境搭建全攻略:从虚拟机到生产服务器的完整迁移方案 在金融、军工等对网络安全要求极高的行业,服务器通常运行在完全隔离的离线环境中。这种环境下,如何部署Python运行环境并确保所有依赖库正常工作,成为许多运维工程师…...
CentOS 7 编译 Linux 5.15 内核遇 BTF 报错?别慌,这份保姆级排错指南帮你搞定 dwarves 和 pahole
CentOS 7 编译 Linux 5.15 内核 BTF 报错全攻略:从 dwarves 编译到环境修复 在 CentOS 7 上手动编译较新版本的 Linux 内核(如 5.15 系列)时,启用 BTF(BPF Type Format)功能经常会遇到各种依赖问题。本文将…...
