根据身高重建队列-LeetCode

题目:

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

原文链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height

思路:

  1. 首先理解题目含义,数组中每个元素有两个属性,h是自身的身高,k是重建后的数组中,他前面有多少个不比他矮的人(>=)
  2. 这题本质就是将元素放到它适合的位置,依据是不同元素间两个属性值的比较。
  3. 说到这应该就能联想到排序了,只不过这题简单排序并不够,还需要在排序基础上进行移位,其实仔细观察示例2,它的输入恰好是满足按照h降序,k升序的排列方式
  4. 按照h降序是因为关键属性k的含义是前面的人比他高或者相等,所以高的在前面插入才有意义;按照k升序是因为如果k大的元素在前面,无法根据k找到合适的位置插入,因为存在的元素个数可能会小于k
  5. 在排序基础上,我们根据k将元素添加至空数组中

代码:

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        result = []
        if len(people)==0: return result
        people = sorted(people, key=lambda x:(-x[0],x[1]))
        for p in people:
            if p[1]>len(result):
                result.append(p)
            else:
                result.insert(p[1],p)
        return result

猜你喜欢

转载自blog.csdn.net/qq_35221523/article/details/112796297