406. 根据身高重建队列

news2024/11/15 20:11:21

假设有打乱顺序的一群人站成一个队列,数组 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]]
 

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

思路:

题目给了若干个数组,数组的第一个参数是第i个人的身高,第二个参数是第i个人前面有几个比自己高的人,根据题目要求,可以想到按照每个人的身高从高到低排序,再依次遍历每个人的第二个参数k,之所以先根据人的身高从低到高排序是为了遍历到某人的k值时直接将其移到第k个位置,因为身高是从高到低排的,所以移到数组下标为k的位置那么他前面就刚好有k个比他高的人,即使再向后。

那分析到这里可以意识到,一开始遗漏掉了题目里的另一个条件,题目给的k的含义是排在当前位置的人前面有k个大于或等于当前位置人的身高的数量,开始没注意到这个等于的条件导致一些用例测试错误。

输入:       [[9,0],[7,0],[1,9],[3,0],[2,7],[5,3],[6,0],[3,4],[6,2],[5,2]]

输出:       [[3,0],[6,0],[7,0],[5,2],[3,4],[6,2],[5,3],[2,7],[9,0],[1,9]]

预期结果:[[3,0],[6,0],[7,0],[5,2],[3,4],[5,3],[6,2],[2,7],[9,0],[1,9]]

 找到问题之后,将相同身高的人按照其k值的大小从低到高排序便解决了这个问题。

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] > o2[0] ? -1 : (o1[0] == o2[0])&&(o1[1] < o2[1]) ? -1 : 1;
            }
        });

        int length = people.length;
        for (int i = 0; i < length; i++) {
            insertPeople(i, people[i][1], people);
        }
        return people;
    }

    public void insertPeople(int sour, int dest, int[][] people) {
        int sourH = people[sour][0];
        int sourK = people[sour][1];

        for (int i = sour; i > dest; --i) {
            people[i][0] = people[i - 1][0];
            people[i][1] = people[i - 1][1];
        }
        people[dest][0] = sourH;
        people[dest][1] = sourK;
    }
}

 另一种排序的方法

Arrays.sort(people, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);

 

方法二:List进行插值

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, ((o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]));

        List<int[]> queue = new ArrayList<int[]>();
        int length = people.length;
        for(int[] p:people){
            queue.add(p[1],p);//根据k把p插到对应的序号
        }
        return queue.toArray(new int[people.length][2]);
    }
}

优化排序

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] > o2[0] ? -1 : (o1[0] == o2[0]) && (o1[1] < o2[1]) ? -1 : 1;
            }
        });

        List<int[]> queue = new ArrayList<int[]>();
        int length = people.length;
        for(int[] p:people){
            queue.add(p[1],p);//根据k把p插到对应的序号
        }
        return queue.toArray(new int[people.length][2]);
    }
}

 

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

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

相关文章

生成与指定数组具有相同形状的全1数组np.ones_like()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 生成与指定数组A形状相同的全1数组 np.ones_like() 选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([[0,1],[2,3]]) print("【显示】a\n",a) print(&qu…

九龙证券|293份一季报预告逾七成预喜 机械设备等赛道业绩亮眼

2023年一季报预告正在连续出炉。Choice数据显现&#xff0c;截至4月17日21时&#xff0c;已有293家上市公司发布2023年一季报预告&#xff0c;按估计完成归母净利润同比变化幅度上限来看&#xff0c;其间有219家公司成绩预喜&#xff0c;占比约74.74%。分职业来看&#xff0c;机…

List

1.基本概念 功能: 将数据进行链式存储 链表(list) 是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成: 链表由一系列结点组成 结点的组成: 一个是存储数据元素的数据域&#xff0c;另一个是存储下一个结点地址的…

18.生命周期

目录 1 开启生命周期 2 创建前 beforeCreate() 3 创建后 created() 4 渲染前 beforeMount() 5 渲染后 mounted 6 更新渲染前 beforeUpdate() 7 更新渲染后 updated() 8 移除前 beforeUnmount() 9 移除后 unmounted() 生命周期是指 一个组件从创建->运行-&…

linux安装和使用jekins

Jenkins详细安装配置部署--超详细_jenkins安装部署_宝贝富贵猪的博客-CSDN博客 1.安装JDK 2.获取安装包 下载页面&#xff1a;https://jenkins.io/zh/download/ 或者Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.安装Jenkins sud…

深入理解Android布局:ConstraintLayout和RecyclerView的使用

深入理解Android布局&#xff1a;ConstraintLayout和RecyclerView的使用 I. 引言 介绍Android中布局的重要性 提出使用ConstraintLayout和RecyclerView布局的目的和意义 II. ConstraintLayout的使用 介绍ConstraintLayout的基本概念和特点 详细介绍ConstraintLayout的各种属性…

Spring Cloud微服务架构组件【Java培训】

SpringCloud是一系列框架的有序集合&#xff0c;为开发人员构建微服务架构提供了完整的解决方案。Spring Cloud根据分布式服务协调治理的需求成立了许多子项目&#xff0c;每个项目通过特定的组件去实现&#xff0c;下面我们讲解一下Spring Cloud 包含的常用组件以及模块。 (1…

【工业智能】需要了解的知识

【工业智能】需要了解的知识 算法数据预测模型决策协同模型优化控制异常诊断 图像目标检测语义分割关键点检测图像匹配3D抓取度量学习异常检测6D姿态估计 工业自动化、物联网通信IOT工业自动化边缘计算 写在前面&#xff1a; 本文仅为自己记录&#xff0c;不具有指导意义。 算法…

软文推广:真实有效提升软文排名与收录的三大方法!

软文是一种具有良好传播效果的文体&#xff0c;可以通过在搜索引擎中排名靠前的方式&#xff0c;为品牌或企业带来更多曝光。但是&#xff0c;如何让软文在搜索引擎中得到更好的收录和排名呢&#xff1f;在本文中&#xff0c;我们将讨论如何提升软文的收录和排名&#xff0c;以…

【DNS域名解析服务】

目录 一、DNS系统的作用DNS的介绍1.1、通用的顶级域名 二、DNS域名解析&#xff08;面试题&#xff09;三、DNS查询方式递归查询迭代查询 四、构建DNS域名服务器步骤4.1、安装bind软件包4.2、修改配置文件4.3、域名的配置修改区域配置文件&#xff0c;添加正向区域配置 4.4、覆…

Canokey Pigeon的初级玩法

Canokey Pigeon的初级玩法 前言开箱使用控制台新版旧版 初步设置FIDO2 PIN更改重置 坑&#xff08;或者说不满意的地方&#xff09;玩法FIDO2/U2FOpenPGPPIVNDEFOATH 参考 本文转载于我的博客Canokey Pigeon的初级玩法 Canokey Pigeon今天终于到货了 {% note warning flat %} …

【C++缺省参数、函数重载详解】

目录 一、缺省参数1.1缺省参数的定义1.2缺省参数的分类1.3缺省参数使用时的注意事项 二、函数重载2.1函数重载的概念2.2为什么要有函数重载2.3 C支持函数重载的原理 一、缺省参数 1.1缺省参数的定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&a…

搭建B2B2C多用户国际版商城系统,快速为外贸企业开拓新市场

企业市场竞争激烈&#xff0c;不只体现在国内&#xff0c;甚至全球&#xff0c;电商行业发展迅速&#xff0c;各企业各行业甚至进出口都竞争相当激烈。要想在这种告诉竞争中脱颖而出&#xff0c;开拓新市场&#xff0c;带来新盈利与新契机是必不可少的。易族智汇Javashop助力企…

nmap学习笔记

一、环境准备 Windows10主机Kali虚拟机&#xff08;使用nmap的地方&#xff09;metasploitable虚拟机为以上三个操作系统配置静态IP。 Windows主机的IP&#xff1a;192.168.80.3Kali的IP&#xff1a;192.168.80.2metasploitable的IP&#xff1a;192.168.80.4 具体配置方法请参…

STM32-窗口看门狗WWDG实验

窗口看门狗本质上是一个能产生系统复位信号和提前唤醒中断的定时器。它通常被用来监测&#xff0c;由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新&#xff0c;否则看门狗电路在达到预置的时间周期时…

代码随想录二刷-队列及其应用题目(JS)【重要】

239.滑动窗口最大值 题目 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 你能在线性时间复杂度内解决此题吗…

Thinkpad-t470电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Thinkpad-t470 处理器Intel Core i7-6600U 2.6GHz / 3.4Ghz Turbo已驱动 内存16GB DDR4 2666Mhz (SK Hynix)已驱动 硬盘Intel SSD Pro 7600P 51…

与Linux的文件权限有关的知识

在Linux系统中&#xff0c;每个文件都有一个所有者和一个用户组。此外&#xff0c;系统还定义了一个“其他人”分类。 文件的所有者通常是创建该文件的用户&#xff0c;而用户组则是在创建该文件时指定的。如果没有指定&#xff0c;则默认为创建用户的主用户组。用户组可以在文…

核心业务1:账户绑定业务

核心业务1:账户绑定业务 1.业务流程图 2.账户绑定数据库设计 3.账户绑定业务流程 4.代码逻辑 5.代码逻辑细节 核心业务1:账户绑定业务 1.业务流程图 ①用户绑定数据到商户平台(已

C++map/set与unordered系列的区别

文章目录 map/set与unordered系列的区别map/set与unordered系列的性能对比测试总结 map/set与unordered系列的区别 1: map/set遍历时是有序的,unordered_map/unordered_set遍历时是无序的. 以set和unordered_set容器为例: 2: map/set是双向迭代器,底层数据结构为红黑树,unor…