406. Queue Reconstruction by Height

TAG: 貪婪

原題

Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k), where h is the height of the person and k is the number of people in front of this person who have a height greater than or equal to h. Write an algorithm to reconstruct the queue.

Note:
The number of people is less than 1,100.

Example

Input:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

Output:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

思路

先思考大家高度都是一樣的情況,比如[7,0]和[7,1]這樣兩個人,正確的排序方法就是讓k更大的人往後排。

這時,我們推廣一下,如果加入一個更矮的人,比如[6,1],那麼他應該放哪裏呢,顯然應該放在[7,0]和[7,1]之間,最後形成了[7,0][6,1][7,1]這樣的序列。

如果我們加入一個更高的人呢?比如[8,0],顯然要構成[7,0][7,1][8,0]

通過觀察我們可以發現,插入更矮的人,是不會改變已經按高度排好隊的序列的,只是更矮的人會插入到這些人之間,再思考一下,矮的人要插入到什麼位置呢?

由於條件限制,k所表示的是這個人前面有幾個人,k=1,前面有1個,k=2,前面有兩個。

綜合以上,當我們在一個按高度排序好的隊列中,插入一個更矮的人,就直接放在第k個位置上。

這樣,我們就可以將原來的數組,先按高度h逆序排(高個子的在前面),然後再按k順序排。

然後,再建立一個新的數組,依次的從排好的原數組中取出元素,插入到當前項的第k個位置上。

想想看,第一個插入進來的,一定是最高的那個[8,0],它左邊的人最少(爲0),第二個插入進來的,一定是和第一個人一樣高或者矮於第一個人的人,它的k一定是1。[8,0][7,1]

第三個人如果更加矮,因爲現在數列中有兩個人了,k必然是1,或者2,否則的話,題目給的數據就是錯的,無法正確的處理了。

可以繼續推理下去……

要是還是沒有理解,可以再參考一下原題的解答:406. Queue Reconstruction by Height

這道題是屬於那種沒有思路真是難想出來的那種

代碼如下:

public int[][] reconstructQueue(int[][] people) {
    Arrays.sort(people, new Comparator<int[]>() {

        @Override
        public int compare(int[] o1, int[] o2) {
            return o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0];
        } 
    });

    List<int[]> output = new LinkedList();
    for (int[] p : people) {
        output.add(p[1], p);
    }
    return output.toArray(new int[people.length][2]);
}

更多幹貨內容,歡迎關注我的公衆號:好奇碼農君
關注了之後就可以在手機上隨時隨地查看文章啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章