Leetcode.406 经典算法题:根据身高重建队列

2023-11-19

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

示例 1:

输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解释:
编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。
编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。
编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。
编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。
编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。
示例 2:

输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]

 

提示:

1 <= people.length <= 2000
0 <= hi <= 106
0 <= ki < people.length
题目数据确保队列可以被重建

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

相同的h 不同k 则k较小的在前;

不同的h 时则取决于k的值,k表示前面有几个大于等于ki的值

因此应该从大往小进行插入(链表的效率较高)

代码:

自定义比较规则 按照从大到小的顺序排序people数组;

然后将people数组中的元素从大到小插入,ki表示其当时的插入位置;

class Solution {
static bool cmp(const vector<int> a, const vector<int> b)
{
    if(a[0] != b [0])
        return a[0] > b [0];
    else
        return a[1] < b[1];
}
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
       int n = people.size();
       if(n == 0) return vector<vector<int>>();
       sort(people.begin(),people.end(),cmp);
       //vector<vector<int>> ans;
       list<vector<int>> que; 
       for(int i =0; i < n; i++)
       {
            if(people[i][1] >= que.size())
               que.push_back(people[i]);
            else
            {
                list<vector<int>>::iterator it = que.begin();
                int pos = people[i][1];
                while(pos-- > 0)
                {
                    it++;
                }
                que.insert(it,people[i]);
            }
                
       }
       return vector<vector<int>>(que.begin(),que.end());
    }
};

耗时96ms,较数组插入法提高一倍;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode.406 经典算法题:根据身高重建队列 的相关文章

随机推荐

  • CentOS7 最小化安装后的必备操作

    来源于 https blog csdn net f srion article details 54910943 在VM虚拟机中安装CentOS 7 时 有时候顾虑到电脑硬件性能 我们需要最小化安装 而最小化安装后与centos6的版本是有
  • 魔百盒 修改时间服务器,魔百盒网关服务器下发超时

    魔百盒网关服务器下发超时 内容精选 换一换 第三方应用在物联网平台订阅了设备服务信息变化通知后 订阅的通知类型为serviceInfoChanged 当平台向设备下发命令修改设备服务信息时 平台会向第三方应用推送通知消息 支持物联网平台向订
  • python的内置容器(list、set、tuple、dict)概念、使用及遍历方法

    容器概念 线性表 有序的容器结构 数组 array 是由连续的内存空间组成 栈 stack 先进后出 后进先出 队列 queue 先进先出 后进后出 链表 list 是由不连续的内存空间组了逻辑结构 单向链表 内存小 效率低 双向列表 内存
  • kubeadm 安装k8s

    关于k8s集群化部署 以下均是个人一步一步的完成部署 并且会罗列出在部署过程中遇到的各种问题及其解决方式 一 环境准备 环境准备阶段试用与master节点部署与work节点部署 即master和work节点全部都需要执行这些步骤 1 关闭防
  • LCR 005. 最大单词长度乘积----位掩码的使用

    题目描述 给定一个字符串数组 words 请计算当两个字符串 words i 和 words j 不包含相同字符时 它们长度的乘积的最大值 假设字符串中只包含英语的小写字母 如果没有不包含相同字符的一对字符串 返回 0 示例 1 输入 wo
  • javascript——js string 转 int 注意的问题——parseInt

  • Linux搭建C++开发调试环境的方法步骤

    安装g Linux编译C 程序必须安装g 编译器 这里使用yum方式安装 首先切换到root账号 su root 然后输入密码 执行yum install gcc c 注意不是yum install g 报错 报错是因为yum需要配置正确的
  • 安装启动配置mysql5.7_MySQL5.7多实例安装及开机启动配置(亲测)

    安装环境 CentOS版本 CentOS7 6 1810 MySQL版本 5 7 9 以前一些很low的方法是 解压两个mysql 分别放到不同文件夹 其实在mysql中已经考虑到了多实例安装的情况 也有相应的脚本命令的支持 现在安装两个m
  • 发牌程序 java

    题目要求 代码 package PokerGame import java util public class PokerGame 黑桃 红心 草花 方块 int m 牌数 int n 人数 int warning 0 有余数 int po
  • unity各种路径

    1 Resources路径 Resources文件夹是Unity里自动识别的一种文件夹 可在Unity编辑器的Project窗口里创建 并将资源放置在里面 Resources文件夹下的资源不管是否有用 全部会打包进 apk或者 ipa 并且
  • 什么是依赖注入

    什么是依赖注入 依赖注入指的是在Spring创建对象的过程中 把对象依赖的属性注入到对象中 依赖注入的方式主要包括 基于 set 方式注入 也即属性注入 基于构造器方式的注入 p命名空间注入 对应属性注入 c命名空间注入 对应构造器注入 p
  • [Java实现 Scoket实时接收Tcp消息 优化层层叠加]

    目录 前言 基础实现代码 描述 优化代码多线程处理客户端连接和消息接收 描述 再次优化异步实现 以下是使用 CompletableFuture 实现异步处理客户端请求的示例代码 描述 进一步优化的代码 Netty来实现Socket服务器 描
  • AntV 柱状图

    AntV 柱状图图表 Step 1 npm install antv g2 Step 2 创建柱状图容器 div div 代码截图 代码生成效果 源码 const chartData 0 date Jan num 4 1 date Feb
  • 一篇文章实习心得

    1 爬虫实习 2月 如果公司已经搭建好了爬虫框架比如scrapy那么爬的方向可能也是固定的 代码复用率应该很高 只需要分析页面的逻辑 以及想要爬的字段 自己按照前辈写的代码修改就好了 如果公司没有搭建好框架 你是公司的第一个爬虫工程师 你要
  • mysql的主键规则_MySQL主键(PRIMARY KEY)

    主键 PRIMARY KEY 的完整称呼是 主键约束 MySQL 主键约束是一个列或者列的组合 其值能唯一地标识表中的每一行 这样的一列或多列称为表的主键 通过它可以强制表的实体完整性 选取设置主键约束的字段 主键约束即在表中定义一个主键来
  • Python如何执行shell脚本

    Python如何执行shell脚本 自从出了Pyhon3 5之后 os模块下的system os popen 基本被废弃了 因此如下只介绍2种方式 一 使用commands模块 有三个方法可以使用 1 commands getstatuso
  • wireshark 实用过滤表达式

    wireshark 实用过滤表达式 针对ip 协议 端口 长度和内容 1 关键字 与 eq 和 等同 可以使用 and 表示并且 或 or 表示或者 非 和 not 都表示取反 多组条件联合过滤数据包的命令 就是通过每个单个的条件命令与关键
  • python教程29-继承的基本使用、继承的注意事项、类方法和静态方法回顾、私有属性的继承特点、新式类和经典类

    python教程 小白入门2021 4 5 学习目标 文章目录 python教程 小白入门2021 4 5 P 168 继承的基本使用 P169 继承的注意事项 P170 类方法和静态方法回顾 P171 私有属性的继承特点 P172 新式类
  • 干货:Java正确获取客户端真实IP方法整理

    在JSP里 获取客户端的IP地址的方法是 request getRemoteAddr 这种方法在大部分情况下都是有效的 但是在通过了Apache Squid等反向代理软件就不能获取到客户端的真实IP地址了 如果使用了反向代理软件 将http
  • Leetcode.406 经典算法题:根据身高重建队列

    假设有打乱顺序的一群人站成一个队列 数组 people 表示队列中一些人的属性 不一定按顺序 每个 people i hi ki 表示第 i 个人的身高为 hi 前面 正好 有 ki 个身高大于或等于 hi 的人 请你重新构造并返回输入数组