406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]
先比较总的身高大小,按照身高从大到小进行排序,因为k的值是按照前面是否有k个人高于或等于自身身高进行匹配的,
所以身高高的人对与矮的人是无视的,先进行身高进行排序,在按照k值进行排序.
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];
//根据k值进行比较,假设 o1[1]=1,o2[0]=0,这应该返回负数,使o1排前面
}
});
这里是构造了一个比较器Comparator,在按照高到低进行排序的同时,再进行k值的比较的时候。
建立比较强
public int compare (int[] o1, int[] o2) {
return o1[0] == o2[0] ? o1[1] - o2[1]:o2[0] - o1[0];
//根据k值进行比较,假设 o1[1]=1,o2[0]=0,这应该返回负数,使o1排前面
}
如果两个people[][0]的值不一样,就进行身高比对大小,根据大小进行排序.如果体重相同则比较k值,不同这比较体重。当return等于负数的时候,o1比o2小
反之o1比o2大 比较器按照大小进行排序。此时比较是
全部解题代码
public int[][] reconstructQueue(int[][] people) {
//比较器Comparator的构造
//如果返回值为负数意味着o1比o2小,否则返回为零意味着o1等于o2,返回为正数意味着o1大于o2,返回值为负数,则表示o1比o2小,o1排在前面;反之如果返回1,则表示o2比o1小,so排在前面。
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];
//根据k值进行比较,假设 o1[1]=1,o2[0]=0,这应该返回负数,使o1排前面
}
});
// 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()][1]]);
}