题目
1.描述
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
2.示例
输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
3.思路
- 需要先考虑高个子, 因为对于数据
[6,1] [7,0] [7,1]
,若先考虑小个子,[7,0] [6,1]
中[6,1]
已经在合适位置上, 但若再加入数据[7,1]
,[6,1]
的位置需要发生改变. - 按照身高h的降序, 人数k的升序对二维数组进行排序
- 排序后即可使用贪心算法, 每次选取最高的人
p
, 并将他安排到p[1]
位置
4.代码
public int[][] reconstructQueue(int[][] people) {
if (people == null || people.length == 0 || people[0].length == 0)
return new int[0][0];
Arrays.sort(people, new Comparator<int[]>() {
// 按照身高降序,个数K升序进行排序,最后将某个学生插入下标为K的位置即可
@Override
public int compare(int[] a, int[] b) {
return a[0] == b[0] ? a[1] - b[1] : b[0] - a[0];
}
});
List<int[]> queue = new ArrayList<>();
for (int[] p : people) {
queue.add(p[1], p);
}
return queue.toArray(new int[queue.size()][]);
}
笔记:
- List接口中的add方法: 对于
add(i,v)
,可将元素v
添加至List的i
位置, 但前提是i
之前的位置中元素都不为空. - 对于上述的add方法,若进行以下操作:
list.add(0,1);list.add(1,2);list.add(0,3)
后,list内容为[3,1,2]
。即,当向同一个位置插入元素时,原有元素将会后移
参考: 链接