title: 406-根據身高重建隊列
date: 2019-04-15 21:13:06
categories: LeetCode
tags:
- Java容器
- 比較器
- 貪心思想
題目描述
假設有打亂順序的一群人站成一個隊列。 每個人由一個整數對(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]]
解題思路
一開始還不太理解題目的意思,想了一會兒才搞懂。是這個意思:一群人本來期望是按輸出那樣排列的,但是現在被打亂了,但是每個人的數組都還是原有的信息,希望找到一種算法能把這個打亂的隊列(輸入)還原成期望的排列(輸出)。
算法可以按以下步驟進行:
- 先把這一群人按某種順序排列
- 依據上述的順序,加入到一個新的集合達成重新排列
1 中所說的某種順序,根據題目要求應該為身高降序,也就是說先考慮把身高較高的人放入新集合,這樣在高個子前面或后面插入矮個子都不會影響當前高個子的k
值;其次,k
值應該升序排列,k
值較大的較后插入。
按 1 中排好的順序,將每個元素插入隊列的第k
個位置。
Java 實現
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];
}
});
// for (int[] person : people) {
// System.out.println(Arrays.toString(person));
// }
List<int[]> queue = new ArrayList<>();
for (int[] person : people) {
queue.add(person[1],person);
}
return queue.toArray(new int[queue.size()][]);
}
心得體會
- 比較器
Comparator
的構造 - 貪心思想的運用
- 集合 api 的運用