【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;
}

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

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

相关文章

分享超级实用的3款AI工具,让工作效率轻松翻倍

Hey&#xff0c;职场小伙伴们&#xff01;每天被堆积如山的工作压得喘不过气&#xff1f;加班成了日常&#xff0c;效率却不见提高&#xff1f;别急&#xff0c;今天就让我来给你们揭秘3款AI神器&#xff0c;它们将是你职场上的得力助手&#xff0c;让你的工作效率轻松翻倍&…

在Linux上部署和管理OpenStack云平台

部署和管理OpenStack云平台在Linux上是一个相当复杂的任务&#xff0c;涉及到多个组件和服务的配置和集成。下面是一个简化的步骤概述&#xff0c;用于在Linux上部署和管理OpenStack云平台&#xff1a; 1. 环境准备: • 确保你有足够数量的服务器作为控制节点、计算节点、网络…

ExoPlayer 迁移到 Media3 日志

参考网站 中文&#xff1a;https://developer.android.google.cn/media/media3/exoplayer/mappings?authuser3&hlzh-cn 英文&#xff1a;https://developer.android.google.cn/media/media3/exoplayer/migration-guide?hlen&authuser0 主体 替换 ExoPlayerMedia3c…

AR视频技术与EasyDSS流媒体视频管理平台:打造沉浸式视频体验

随着增强现实&#xff08;AR&#xff09;技术的飞速发展&#xff0c;其在各个领域的应用日益广泛。这项技术通过实时计算摄影机影像的位置及角度&#xff0c;将虚拟信息叠加到真实世界中&#xff0c;为用户带来超越现实的感官体验。AR视频技术不仅极大地丰富了我们的视觉体验&a…

菜鸡的原地踏步史02(◐‿◑)

每日一念 改掉自己想到哪写哪的坏习惯 二叉树 二叉树的中序遍历 class Solution {/**中序遍历左 - 中 - 右*/private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null) {return res;}tranve…

阶段总结——基于深度学习的三叶青图像识别

阶段总结——基于深度学习的三叶青图像识别 文章目录 一、计算机视觉图像分类系统设计二、训练模型2.1. 构建数据集2.2. 网络模型选择2.3. 图像数据增强与调参2.4. 部署模型到web端2.5. 开发图像识别小程序 三、实验结果3.1. 模型训练3.2. 模型部署 四、讨论五、参考文献&#…

Linux: network: openvswitch: disk 访问速度导致不稳定

在文件utilities/ov-ctl.in 文件中有提到一个目录:OVS_RUNDIR Default directories with "configure" option and environment variable override:logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR)pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR)conf.db

Linux wget报未找到命令

wget报未找到命令需要安装wget 1、下载wget安装文件&#xff0c;本次于华为云资源镜像下载 地址&#xff1a;https://mirrors.huaweicloud.com/centos-vault/7.8.2003/os/x86_64/Packages/ 2、下载后上传到安装服务器/install_package&#xff0c;执行命令安装 rpm -ivh /i…

联合概率密度函数

目录 1. 什么是概率密度由联合概率密度求概率参考链接 1. 什么是概率密度 概率密度到底在表达什么&#xff1f; 外卖在20-40分钟内送达的概率 随机变量落在[20,40]之间的概率。下图中&#xff0c;对总面积做规范化处理&#xff0c;令总面积1&#xff0c; f ( x ) f(x) f(x)则成…

用requirements.txt配置环境

1. 在anaconda创建环境 创建Python版本为3.8的环境&#xff0c;与yolov5所需的包适配。 2. 在Anaconda Prompt中激活环境 (base) C:\Users\吴伊晴>conda activate yolov5 3. 配置环境 用指定路径中的requirements.txt配置环境。 (yolov5) C:\Users\吴伊晴>pip insta…

1、Reids之基础

Reids之基础 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&#xff1a;&#xff08;未列全&#xff09; 类型例子Stringhello worldHash{name: “jack”, age: “20”}List[A->B->C]Set{A,B,C}SortedSet{A: 1, B:…

格式化代码 | 美化JSON、SQL

一、格式化JSON数据 打开Postman&#xff0c;将json数据粘到里面&#xff0c;点击Beautify即可美化代码。 二、格式化SQL 打开Navicat&#xff0c;新建查询&#xff0c;将sql粘进去点击”美化sql“即可。 三、浏览器 在线格式化 使用浏览器上的在线格式化网址。例如&…

使用ChatGPT写论文,只需四步突破论文写作瓶颈!

欢迎关注&#xff0c;为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥&#xff08;yida985&#xff09;交流 地表最强大的高级学术AI专业版已经开放&#xff0c;拥有全球领先的GPT学术科研应用&#xff0c;有兴趣的朋友可…

Zero Knowledge Machine Learning-ZKML

目录 一、定义与背景 二、技术特点 三、应用场景 四、发展现状与挑战 五、未来展望 关于 ML 的快速入门知识 EZKL zkML(Zero Knowledge Machine Learning)是一种将零知识证明(Zero-Knowledge Proofs, ZKP)技术融入机器学习中的新兴技术。该技术旨在解决机器学习中的…

【深入探索】WebKit与WebGL:渲染高性能图形的秘密

标题&#xff1a;【深入探索】WebKit与WebGL&#xff1a;渲染高性能图形的秘密 WebKit是许多流行的网络浏览器的引擎&#xff0c;包括Safari和之前的版本的Chrome。它负责解析HTML、CSS和JavaScript&#xff0c;以及提供许多其他Web功能。WebGL是一种在浏览器中渲染3D图形的AP…

滑动窗口(C++)

文章目录 1、长度最小的子数组2、无重复字符的最长子串3、最大连续1的个数 Ⅲ4、将x减到0的最小操作数5、水果成篮6、找到字符串中所有字母异位词7、串联所有单词的子串8、最小覆盖子串 通常&#xff0c;算法的主体说明会放在第一道题中。但实际上&#xff0c;不通常。 算法在代…

大数据面试题之数据库(3)

数据库有必要建索引吗? MySQL缺点? 什么是脏读?怎么解决? 为什么要有三大范式&#xff0c;建数据库时一定要遵循吗? 数据库一般对哪些列建立索引?索引的数据结构? MySOL中索引的建立需要考虑哪些问题 关系型数据库与非关系型数据库区别 MySQL与Redis区别 …

前端代码规范 - 日志打印规范

在前端开发中&#xff0c;随着项目迭代升级&#xff0c;日志打印逐渐风格不一&#xff0c;合理的日志输出是监控应用状态、调试代码和跟踪用户行为的重要手段。一个好的日志系统能够帮助开发者快速定位问题&#xff0c;提高开发效率。本文将介绍如何在前端项目中制定日志输出规…

Linux网络基础与配置:基本网络命令详解

网络基础与配置&#xff1a;基本网络命令详解 在网络管理和配置中&#xff0c;掌握基本的网络命令是至关重要的。这些命令不仅能够帮助我们了解和诊断网络环境&#xff0c;还能进行网络配置和故障排除。本文将详细介绍常用的网络命令&#xff1a;ifconfig、ping、netstat、ss等…

gradle构建工具

setting.gradle // settings.gradle rootProject.name my-project // 指定根项目名称include subproject1, subproject2 // 指定子项目名称&#xff0c;可选jar包名称 方式一 jar {archiveBaseName my-application // 设置 JAR 文件的基本名称archiveVersion 1.0 // 设置…