首页 > 其他分享 >【代码随想录】刷题记录(91)-根据身高重建队列

【代码随想录】刷题记录(91)-根据身高重建队列

时间:2025-01-07 16:30:26浏览次数:3  
标签:people 队列 List 随想录 编号 91 身高 人排 刷题

题目描述:

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

 

我的作答:

都是什么偏题怪题,好烦好烦,杀杀杀。。。先根据身高降序,列升序排列,然后再根据列调换位置,比如[x, 2]就把这个元素插入到队列中索引为2的位置,此时它前面有2个身高比它高的元素。。以此类推

class Solution(object):
    def reconstructQueue(self, people):
        """
        :type people: List[List[int]]
        :rtype: List[List[int]]
        """
        from collections import deque
        people.sort(key=lambda x:(-x[0], x[1])) #这个写法第一次见
        q = []
        for i in range(len(people)):
            position = people[i][1]
            q.insert(position, people[i])
        return q

sort(key=lambda x:(a, b))默认都是按a b参数值升序排列,如果a b都大于0,只需要取反就能降序排列了,太棒了!!

c351d8d6d42a465fad33e7c5f9685974.png

 

参考:

class Solution(object):
    def reconstructQueue(self, people):
        """
        :type people: List[List[int]]
        :rtype: List[List[int]]
        """
        # 先按照h维度的身高顺序从高到低排序。确定第一个维度
        # lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序
        people.sort(key=lambda x: (-x[0], x[1]))
        que = []
	
	# 根据每个元素的第二个维度k,贪心算法,进行插入
        # people已经排序过了:同一高度时k值小的排前面。
        for p in people:
            que.insert(p[1], p)
        return que

d3837e1ca70e44c092f20c451b634eae.png

 

标签:people,队列,List,随想录,编号,91,身高,人排,刷题
From: https://blog.csdn.net/Aerochacha/article/details/144986808

相关文章

  • 【代码随想录】刷题记录(92)-用最少数量的箭引爆气球
    题目描述:有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i]=[xstart,xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切y坐标。一支弓箭可以沿着x轴从不同点 完全垂直 地射出。在坐标 x ......
  • 代码随想录算法训练营第五十六天|KM108.冗余连接|KM109.冗余连接Ⅱ
    108.冗余连接本题光看题目没理解具体什么意思;看了题解有点明白了;(个人觉得还是力扣的题目描述比较容易理解)题目意思:大概就是加一条边使树结构有环,然后再环中去掉一条边(如果环中多条边可取,则去掉最后一条边),仍然变成一颗树结构;思路:观察两个节点是否再一个集合,如果不在,也可以将......
  • 代码随想录算法训练营第二十八天-贪心算法-122. 买卖股票的最佳时机II
    有奇妙的解法分析要获得利润,就是当天卖出前一天买入的的利润,也就是当天价格减去前一天的价格通过这样的运算,可以得到一个新的序列,这个序列就是上一道53的最大子序和的应用了而且把这些子序和中所有正数值都加到一起就是最大利润了#include<iostream>#include<vector>c......
  • springboot高校师生健康档案管理系统-计算机毕业设计源码69161
     摘要本文介绍了一款专为高校师生设计的健康档案管理系统。该系统集校园公告、健康资讯和健康知识管理于一体,利用先进的信息化技术为师生提供便捷、全面的健康信息服务。系统具备用户友好的交互界面,支持师生自主录入健康数据,实现健康档案的电子化管理。同时,系统强大的数据统......
  • 【剑指Offer刷题系列】序列化与反序列化二叉树
    目录问题描述示例示例1:示例2:示例3:示例4:提示思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度问题描述序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内......
  • 【剑指Offer刷题系列】数组中数字出现的次数 II
    目录问题描述示例示例1:示例2:思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度结论问题描述教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组actions,其中actions[i]表示做出该动作的人员......
  • 【剑指Offer刷题系列】整数拆分 II
    目录问题描述示例示例1:示例2:示例3:思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度结论问题描述现需要将一根长度为正整数bamboo_len的竹子砍为若干段,每段长度均为正整数。请返回每段竹子长度的最大乘积......
  • 【剑指Offer刷题系列】数值的整数次方
    目录问题描述示例示例1:示例2:示例3:思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度结论问题描述实现pow(x,n),即计算x的n次幂函数(即,x^n)。注意:x是一个双精度浮点数。n是一个整数,可以是正数、负数或零......
  • 代码随想录 test1(二分详解,包括二分答案)
    一、二分查找关键:确定待查找的元素出现在什么区间内,循环不变量:目标值一定在当前搜索范围内。模板一:在左闭右闭区间内查找目标元素       由于待查找元素在左闭右闭区间,因此要想在已有数组内查找该元素,就要让初始左右指针分别为0,size-1(刚好覆盖整个数组)。   ......
  • AtCoder备赛刷题 ABC 361 | x = a^b
    学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AtCoder备赛刷题|汇总【ProblemStatement】Howmanyintegersxx......