题目描述: 假设有打乱顺序的一群人站成一个队列,数组 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 res = new LinkedList();

// 将二维数组 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()][]);

}

}

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。