題目
https://leetcode-cn.com/problems/queue-reconstruction-by-height
假設有打亂順序的一群人站成一個隊列。每個人由一個整數對(h, k)表示,其中h是這個人的身高,k是排在這個人前面且身高大於或等於h的人數。編寫一個算法來重建這個隊列。
注意:
總人數少於1100人。
示例
輸入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
輸出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
思路
首先,大體上按照身高由大到小的順序進行排序,來保證之後插入的時候我們目標數組的每一個元素都大於我們要插入的元素。之後就好辦了,根據前面有幾個比他高的人來判斷我要將新元素插入到哪個位置,比如前面沒有比他高的人自然就插入到最前面的位置,python的insert函數就像量身為其打造一般。
還有一點需要注意,在身高相同的情況下,前方比本身身高高的人數少的要排在前面。假如兩個人為(x, 0), (x, 1),那麼為了讓後面的人找到比他高的人(也就是(x, 0)),那麼就需要先將(x, 0)插入其中。不是最高身高的情況也是類似的。
於是,我們就需要進行兩次排序,像箱子排序一樣。所幸,python的sort函數是穩定的,於是我們就先將前方人數進行升序排序,再將身高進行降序排序。之後逐一插入就大功告成了
class Solution: def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]: people.sort(key = lambda x: [-x[0], x[1]]) res = [] for p in people: res.insert(p[1], p) return res