LeetCode 406. 根据身高重建队列

题目

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面正好有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

例:
输入: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]] 是重新构造后的队列。

方法:贪心算法

在存在两个维度时,应先确定一个维度,再确定另一维度。对于此题来说,我们应该先确定身高,即按照从大到小进行排列,然后再确定位置,即按照位置进行插入操作

  • queue 表示按照顺序的排列
  • 按照身高从高到低排列,若同一身高,则队列位置优先的先排,即数字小的先排
  • 循环数组,根据 k,即前面正好有 k 个身高大于或等于 h 的人,进行插入操作。
class Solution(object):
    def reconstructQueue(self, people):
        queue = []
        people.sort(key = lambda x:(-x[0], x[1]))
        for i in range(len(people)):
            queue.insert(people[i][1], people[i])
        return queue
相关知识
  • sort(key = None, reverse = False): list.sort()
    排序,直接修改原列表
    key: 形参用来指定在进行比较前要在每个列表元素上调用的函数(或其他可调用对象)
    reverse: 默认 False,即升序
people.sort(key = lambda x:(-x[0], x[1])) # 身高从高到低排列,相同身高按照人数从小到大排列
people.sort(key = lambda x:(x[0], -x[1])) # 身高从低到高排列,相同身高按照人数从大到小排列
  • insert(index, obj): list.insert()
    指定对象插入列表的指定位置
    index: 对象要插入的指定位置
    obj: 对象
参考

代码相关:https://programmercarl.com/0406.%E6%A0%B9%E6%8D%AE%E8%BA%AB%E9%AB%98%E9%87%8D%E5%BB%BA%E9%98%9F%E5%88%97.html
sort():https://docs.python.org/zh-cn/3/howto/sorting.html
insert():https://www.jb51.net/article/178135.htm

你可能感兴趣的:(LeetCode 406. 根据身高重建队列)