LeetCode-406-根据身高重建队列

题目描述:
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

LeetCode-406-根据身高重建队列_第1张图片

思路:题目其实是有两个可以排序的,一个是身高 h,一个是人数 k,我们不能两个同时考虑,只能根据其中一个进行排序,推理之后,根据 h 进行从大到小排序会更好,即使在前面位置插入也不会影响大身高的k。

  1. 排序:将people二维数组根据 h 进行从大到小排序,当h相同,选择k大的在前面;
  2. 插入:遍历排序后的数组,根据 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()][]);
    }
}

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构)