【LeetCode每日一题】[中等]406. 根据身高重建队列
406. 根据身高重建队列
算法思想:数组,排序
题目:
有两种思路:
1.身高从低到高,低的人去留空位k,找到最后的位置
2,身高从高到底,高的人先站好,矮的人去插入k
java代码
从低到高:
- 排序: 身高按照从低到高的顺序;k值按按照大到小的顺序
- 遍历人,利用人的k去找位置; k是几,前面就留几个空位;
- 空的位置是留给比他的高的人或者跟他一样高但k值比他小的人;
- 每遍历完一个人,这个人找到了最终的位置;
class Solution {
public int[][] reconstructQueue(int[][] people) {
//按照身高升序排列(从低到高),身高相同,k值大的排在前面
Arrays.sort(people, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o1[0] - o2[0];//身高升序
}
else {
return o2[1] - o1[1];//相同,k大的排在前面
}
}
});
int n = people.length;
int[][] res = new int[n][];//存放答案
for (int[] p : people) {
//遍历人(k值是降序)
int count = p[1];//记录k值,用来留空位
for (int i = 0; i < n; i++) {
//一个个查找,空位表示更高或者一样高但k更小的人
if (res[i] == null) {
//遇见一个空位,count--
count--;
}
if (count == -1) {
//为-1是表示没有空位需要留了,此时,i就是这个人p最后放置的位置
res[i] = p;
break;
}
}
}
return res;
}
}
从高到低:
- 排序: 身高按照从低高到低的顺序;k值按按照小到大的顺序
- 遍历人,利用人去插入; k是几,就插入到几位;
- 插入完场,意味着前面有k个人高的人满足条件;
class Solution {
public int[][] reconstructQueue(int[][] people) {
//按照身高升序排列(从高到低),身高相同,k值小的排在前面
Arrays.sort(people, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o2[0] - o1[0];
}
else {
return o1[1] - o2[1];
}
}
});
//利用list更好的实现插入
List<int[]> res = new LinkedList<int[]>();
for (int[] p : people) {
res.add(p[1], p);//插入到k个位置上
}
return res.toArray(new int[res.size()][2]);//返回新数组
}
}