开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
周三了,但是明天就要上班了,又又又解封了
根据身高重建队列
该题出自力扣的406题 —— 根据身高重建队列【中等题】
审题
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
- 这道题的题意有点绕,但是理解以后,还是比较清晰明了的
- 给出一个二维数组,数组内存在两个下标,下标0代表高度,下标1代表前面有多少大于自身高度的数量
- 那么就需要重新对这个二维数组排序
- 首先对数组进行排序,重新定义排序规则,判断如果高度一致的话,就按照前面的数量升序,如果高度不一致就按照高度作降序
- 因为高的只会看到高的,那么就可以对高的先进行排序,依次给每一个人在当前的队列中选择一个插入的位置。
- 当我们放入第 i 个人时,只需要将其插入队列中,使得他的前面恰好有 ki 个人即可。
编码
class Solution {
public int[][] reconstructQueue(int[][] people) {
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];
}
});
//创建一个LinkedList集合便于插入操作
List<int[]> list = new LinkedList<>();
//然后根据k值进行插入操作
for(int[] peop : people){
list.add(peop[1],peop);
}
//将List集合转换为数组返回
return list.toArray(new int[people.length][2]);
}
}