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]);
}
更多幹貨內容,歡迎關注我的公衆號:好奇碼農君
關注了之後就可以在手機上隨時隨地查看文章啦