假设该队列每个人身高相同时,则
k
k
k的值即他们在数组中的位置(索引)。
- 例如,如果我们只给出 [7,0] 和 [7,1],那么我们需要返回 [[7,0],[7,1]]。k正是那些人的索引值!
现在,如果来了一个比他们矮的人,例如 [6,1],我们可以将该人插入到数组 [[7,0],[7,1]] 中。但是在哪里插入那个人呢?我们知道这个人目前是所有人中最矮的,应该只有一个高个子站在他们面前。那么,数组中[6,1]的索引为1,因为应该只有1个人比他们高,而数组中的人都已经比他们高了。
- 这意味着我们在索引 1 1 1 处插入 [6,1] 并得到 [[7,0], [6,1], [7,1]]。
算法
因此,该问题的解决方案是:
第1步:根据身高降序排列。如果它们具有相同的高度,则根据它们的索引(
k
k
k)按升序对它们进行排序。我们按索引升序对具有相同身高的人进行排序,因为我们希望较小索引的人排在其他相同身高的人之前。
在示例中,排序后我们应该得到:
[[7,0], [7,1], [6,1], [5,0], [5,2]]
第 2 步:根据索引 k k k将人添加到结果数组中。
代码
- 对人员进行排序
// 根据身高进行降序排序,根据k进行升序排序
Arrays.sort(people, new Comparator<int[] >(){
public int compare(int[] p1, int[] p2) {
if (p1[0]!=p2[0]) {
return p2[0]-p1[0];
}
//相同的身高,按照k降序排序
else {
return p1[1]-p2[1];
}
}
});
另外一种方法,使用下列语法可提高运行时间:
Arrays.sort(people, (a, b) -> a[0] != b[0] ? b[0]-a[0] : a[1] — b[1]);
- 将排序好的人根据索引一个一个加入结果数组中。
- 由于数组需要手动调整移动位置,因此使用ArrayList,最后再转为数组即可。
List<int[]> ans= new ArrayList<int[]>();
for (int i = 0; i < people.length; ++i) {
// people[i][1]为第i个人的k值,people[i]为该人的身高
ans.add(people[i][1],people[i]);
}
// 将ArrayList转为数组
int[][] res = ans.toArray(new int[0][]);