首页 > 其他分享 >力扣 406. 根据身高重建队列

力扣 406. 根据身高重建队列

时间:2023-04-21 16:03:19浏览次数:55  
标签:下标 people 队列 力扣 406 编号 身高 人排

406. 根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 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
  • 题目数据确保队列可以被重建

题解

由题意,当h一样,k不一样时,应按从小到大排序,如[7,1],[7,0],应得到[7,0],[7,1]; 而[7,1],[7,0],[6,1],因为6<7,所以[6,1]插入到[7,1]前面,不会影响7k值1,所以排序应该按h值从大到小,这样在遍历时,即便后面的值插入到前面,也不会影响到前面的k值;
[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]排序完成后得到: [[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]
接下来依次判断插入,得到结果,将k值作为在结果数组中的下标。 step1,插入[7,0]到下标0res=[[7,0]]; step2,插入[7,1]到下标1res=[[7,0],[7,1]]; step3,插入[6,1]到下标1,原下标及右边的元素右移动,res=[[7,0],[6,1],[7,1]]; step4,插入[5,0]到下标0,原下标及右边的元素右移动,res=[[5,0],[7,0],[6,1],[7,1]]; ...
查看代码
 class Solution {
public:
    //排序,优先按h从大到小,按k从小到大
    static bool cmp(const vector<int>& a,const vector<int>& b)
    {
        return b[0]<a[0]||(b[0]==a[0]&&b[1]>a[1]);
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),cmp);//排序
        vector<vector<int>> res;//存储结果
        for(int i=0;i<people.size();++i){//遍历
            res.insert(res.begin()+people[i][1],people[i]);
        }
        return res;
    }
};

标签:下标,people,队列,力扣,406,编号,身高,人排
From: https://www.cnblogs.com/fudanxi/p/17340702.html

相关文章

  • day35| 860+406+452
    860.柠檬水找零 题目简述:在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。注意......
  • 【题解】P4069 [SDOI2016]游戏
    题目描述Alice和Bob在玩一个游戏。游戏在一棵有\(n\)个点的树上进行。最初,每个点上都只有一个数字,那个数字是\(123456789123456789\)。有时,Alice会选择一条从\(s\)到\(t\)的路径,在这条路径上的每一个点上都添加一个数字。对于路径上的一个点\(r\),若\(r\)与\(s\)......
  • 4/21 力扣 82. 删除排序链表中的重复元素 II
    给定一个已排序的链表的头 head, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回已排序的链表 。 示例1:输入:head=[1,2,3,3,4,4,5]输出:[1,2,5]示例2:输入:head=[1,1,1,2,3]输出:[2,3] 提示:链表中节点数目在范围[0,300]内-100<=Node.val<=100题目......
  • 单调队列优化
    1.子矩阵来源:第十四届蓝桥杯省赛C++C组题目链接题目描述给定一个$n×m$($n$行$m$列)的矩阵。设一个矩阵的价值为其所有数中的最大值和最小值的乘积。求给定矩阵的所有大小为$a×b$($a$行$b$列)的子矩阵的价值的和。答案可能很大,你只需要输出答案对$998244353......
  • 单调队列(例题详解+模板cpp)
    有一类问题需要维护一段区间内的最大值或最小值,例如滑动窗口、区间最值等问题。一般情况下,我们可以使用线段树、ST表等数据结构来解决这类问题,但是这些数据结构的实现较为复杂,需要一定的时间和精力来学习和掌握。而单调队列则是一个简单而高效的数据结构,可以用来解决这类问题。基本......
  • 队列
    队列:也是一个线性表(即包括顺序队列和链式队列),先进先出,但限制在两端进行插入和删除队尾:进行存入操作的一端队头:进行删除操作的一端顺序队列://sqqueue.h#ifndef_SQ_QUEUE_H_H#define_SQ_QUEUE_H_H#defineN6typedefintdata_t;typedefstruct{data......
  • 队列和栈的简单实现
    简单实现2个数据结构,来帮助我们更好的处理数据基本队列(Queue)是一种先进先出(FIFO)的数据结构,通常用于按照顺序处理任务或事件。在前端中,队列可以用于实现异步函数的调用、消息通知、动画播放等场景。队列还可以和数组结合使用,通过push()方法将元素添加到队列尾部,shift()方法将......
  • 双端队列数据结构
    双端队列是一种数据结构,也被称为deque或double-endedqueue。它类似于队列,但它允许从队列的两端添加或删除元素,而不仅仅是队列的一端。双端队列可以用数组或链表实现。如果使用数组实现,它可以使用循环数组的方式,使得在头尾进行插入和删除的操作可以在常数时间内完成。如果使用链......
  • C# 获取打印机队列的打印任务
    //引入命名空间:usingSystem.Runtime.InteropServices;[DllImport("winspool.drv",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternboolSetDefaultPrinter(stringprinterName);[DllImport("winspool.drv&quo......
  • w4-1 队列安排
     方法一:#include<iostream>#include<queue>#include<vector>usingnamespacestd;//究极愚蠢queue+vector模拟tleintmain(){queue<int>a;intN,M,judge,k,x;cin>>N;a.push(0);a.push(1);for(inti=2;i<......