406. 根据身高重建队列

题目:

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

注意:
总人数少于1100人。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例:

406. 根据身高重建队列_第1张图片
image.png

思路:

先排序再插入
贪心算法:本题目的特点是无后效性,先排序,按照先H高度降序,K个数升序排序,然后先插入矮个子的。
核心思想:高个子先站好位,矮个子插入到K位置上,前面肯定有K个高个子,矮个子再插到前面也满足K的要求

代码:

class Solution {

    public int[][] reconstructQueue(int[][] people) {//(h,k)
        if (people == null || people.length == 0 || people[0].length == 0) return new int[0][0];
        //排序,按照h降序,k升序
        Arrays.sort(people, (a, b) -> (a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]));
        //依次将每个人插入到队列对应的第k个位置
        //创建一个队列,存放一个(h,k)整数对
        List queue = new ArrayList<>();
        //遍历people
        for (int i[] : people) {
            //将整数对存到队列的第k个(i[1]所存的数据)位置
            queue.add(i[1], i);
        }
        //将队列转换成 行数为队列个数 的一个数组
        return queue.toArray(new int[queue.size()][]);
    }
}

时间复杂度:O(nlogn),空间复杂度:O(1)

你可能感兴趣的:(406. 根据身高重建队列)