【LeetCode Top 100】406. Queue Reconstruction by Height【Medium】【JAVA】

1. 題目

在這裏插入圖片描述

2. 題意

有 n 個 (h, k) 對,h 代表高度,k 代表這個對在隊列中的位置,在它的位置前面,有 k 個對的高度,比它高或等高。例如 (7, 0),代表其高度爲 7,在它前面有 0 個高度不小於它的對。(4, 4) 代表其高度爲 4,在它前面有 4 個高度不小於它的對。

3. 思路

這道題,官方的提示是:
在這裏插入圖片描述
讓你去找出最小高度的數的位置。

首先,我們先假設沒有相同高度的對存在,如果我們插入某個對 (h, k) 的時候,隊列中已經存在的對,高度都比它高,那麼,這個對是不是就應該直接插入在第 k 個位置上。例如假設現在有 (5, 0), (4, 1), (5, 1), 我們插入 (3, 2),相當於,我們應該將它放置到兩個對之後,因爲它前面需要有 2 個比它高的對,因此,插入:(5, 0), (4, 1), (3, 2), (5, 1), 我們可以發現是滿足題意的。那麼相當於對於不同高度的組,我們可以採用由高到低的順序,按照 k 值進行插入的方式進行

接下來,我們考慮對於相同高度的對,對於題目中的要求,k 代表的是大於或者等於的高度的數目,相當於,對於兩個相同高度的組,第二個插入的組,第一個組與其他原先存在的比其大的組沒有不同。因此,我們應當將 k 值大的,放在後面進行插入。例如 (5, 0), (4, 1), (5, 1),我現在有 (3,0), (3,2),假設我們先插入 k 值大的,插入結果爲:(5, 0), (4, 1), (3,2), (5, 1),沒有問題,此時我們再插入 (3,0),變成 (3,0), (5, 0), (4, 1), (3,2), (5, 1),此時就出現了問題,(3, 2) 的對,前面有 3 個對的高度比它高。而如果我們先插入 k 值小的,再插入 k 值大的時,是在其後面,不會影響該值。因此,爲了防止相同高度的對插入時不同 k 值的互相影響,因此,我們應當將 k 值大的,放在後面進行插入。

4. 解題代碼

	public int[][] reconstructQueue(int[][] people) {
		// 根據上面的分析進行排序
		// 對於相同高度的,按照 k 值小的在前面
		// 對於不同高度的,按照 h 值高的在前面
        Arrays.sort(people,
                (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);

		// 排序後,按順序插入,插入時注意按 k 值插入
        ArrayList<int[]> list = new ArrayList<>();
        for (int[] p : people
        ) {
            list.add(p[1], p);
        }
        return list.toArray(new int[people.length][]);
    }

5. 運行結果

在這裏插入圖片描述

6. 相關鏈接

本題代碼的github鏈接
其他 Top 100 Liked Questions 題目

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