LeetCode:根据身高重建队列
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (h, k) 表示,其中 h 是这个人的身高,k 是应该排在这个人前面且身高大于或等于 h 的人数。 例如:[5,2] 表示前面应该有 2 个身高大于等于 5 的人,而 [5,0] 表示前面不应该存在身高大于等于 5 的人。
编写一个算法,根据每个人的身高 h 重建这个队列,使之满足每个整数对 (h, k) 中对人数 k 的要求。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
其实刚开始这个题一点思路也没有,但是我看了LeahChao写的题解。上面说一般这种数对,还涉及排序,根据第一个元素正向排序,根据第二个元素反向排序。或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化过程。上面的动画演示也可以让人理解。
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return a[0]==b[0]?a[1]-b[1]:b[0]-a[0];
}
});
List<int[]> list = new ArrayList<>();
//res的长度如果大于要插入的k值,那么就将要插入的数插入到k值得位置,若res的长度小于要插入的k值,则直接插入
for(int[] p :people){
if(list.size()<=p[1]){
list.add(p);
}else{
list.add(p[1],p);
}
}
return list.toArray(new int[list.size()][]);
}
}
下面的方式则是参照镐锝铼氪的评论编写代码。将二维数组按第一个值升序排序,第二个值降序排序。当前这个人如果是剩下还没安排的人中最矮的人,它的K值就代表它在剩余空位的索引值。如果多个人身高相同,则按K值从大到小领取索引值示例。
[ 0, 1, 2, 3, 4, 5 ] [ 4, 4 ] 4
[ 0, 1, 2, 3, 5 ] [ 5, 2 ] 2
[ 0, 1, 3, 5 ] [ 5, 0 ] 0
[ 1, 3, 5 ] [ 6, 1 ] 3
[ 1, 5 ] [ 7, 1 ] 5
[ 1 ] [ 7, 0 ] 1
[ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 6, 1 ], [ 4, 4 ], [ 7, 1 ] ]
class Solution {
public int[][] reconstructQueue(int[][] people) {
int len = people.length;
int[][] res = new int[len][2];
Arrays.sort(people,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return a[0]==b[0]?b[1]-a[1]:a[0]-b[0];
}
});
List<int[]> list = new ArrayList<>();
//a数组初始为0代表结果二维数组中还未插入值
int[] a = new int[len];
for(int[] p :people){
int n = p[1];
for(int i=0;i<len;i++){
if(a[i]==0){
//当n小于等于0可以判断该位置是要插入的位置
if(n<=0){
a[i]=1;
res[i] = p;
break;
}
n--;
}
}
// if(list.size()<=p[1]){
// list.add(p);
// }else{
// list.add(p[1],p);
// }
}
return res;
}
}