题目描述:
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
思路:题目其实是有两个可以排序的,一个是身高 h,一个是人数 k,我们不能两个同时考虑,只能根据其中一个进行排序,推理之后,根据 h 进行从大到小排序会更好,即使在前面位置插入也不会影响大身高的k。
- 排序:将people二维数组根据 h 进行从大到小排序,当h相同,选择k大的在前面;
- 插入:遍历排序后的数组,根据 k 插入到res列表的第 k 个位置。
代码实现:
class Solution {
public int[][] reconstructQueue(int[][] people) {
List<int[]> res = new LinkedList<int[]>();
// 将二维数组 people 按照 h从大到小进行排序
Arrays.sort(people, (x,y) -> x[0]==y[0] ? x[1]-y[1] : y[0]-x[0]);//这句话很重要
int len = people.length;
// 插入 k
for (int i = 0; i < len; i++) {
int position = people[i][1];//当前k,即要插入的位置
res.add(position, people[i]);
}
return res.toArray(new int[res.size()][]);
}
}