根据身高重建队列

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

自我解答

        先排序,从小到大找合适的位置。
                1、准备一排等长的”座位“  queue  =  [0]  *  length,  0  记作空位
                2、将  people  进行排序,从最矮的人开始,依次去找合适的位置

        因此,依次找位置的过程中,已坐下的人的身高都  <=  当前找位置人的身高
        由于每个人都有个属性:允许前面身高  >=  自己身高的人数
                所以,只需要从左往右数,  依次去找出等量的  空位置数  +  与自己等高人数  就行了

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort()
        length = len(people)
        queue = [0] * length
        for p in people:
            spaces = p[1] + 1
            for i in range(0, length):
                if not queue[i] or queue[i][0] == p[0]:
                    spaces -= 1
                if spaces == 0:
                    break
            queue[i] = p
        return queue
题解

        可以再优化一下,上面算法再找位置时,需要同时考虑  空位  和  与自己等高的人。
        如果在等高的人中,让  p[1]更大的人先找位置的话(p[1]:  允许前面身高  >=  自己身高的人数),  就能确保,在从左往右
        数到  p[1]  时,都不会遇到  和自己等高的人,因此,就只需要数空位就行了。

class Solution2:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda p: (p[0], -p[1]))
        length = len(people)
        queue = [0] * length
        for p in people:
            spaces = p[1] + 1
            for i in range(0, length):
                if not queue[i]:
                    spaces -= 1
                if spaces == 0:
                    break
            queue[i] = p
        return queue

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