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

题目描述

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

注意:
总人数少于1100人。

示例

输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

解题思路

一开始还不太理解题目的意思,想了一会儿才搞懂。是这个意思:一群人本来期望是按输出那样排列的,但是现在被打乱了,但是每个人的数组都还是原有的信息,希望找到一种算法能把这个打乱的队列(输入)还原成期望的排列(输出)。

算法可以按以下步骤进行:

  1. 先把这一群人按某种顺序排列
  2. 依据上述的顺序,加入到一个新的集合达成重新排列

1 中所说的某种顺序,根据题目要求应该为身高降序,也就是说先考虑把身高较高的人放入新集合,这样在高个子前面或后面插入矮个子都不会影响当前高个子的k值;其次,k值应该升序排列,k值较大的较后插入。

按 1 中排好的顺序,将每个元素插入队列的第k个位置。

Java 实现

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];
        }
    });

//        for (int[] person : people) {
//            System.out.println(Arrays.toString(person));
//        }

    List<int[]> queue = new ArrayList<>();
    for (int[] person : people) {
        queue.add(person[1],person);
    }

    return queue.toArray(new int[queue.size()][]);
}

心得体会

  1. 比较器Comparator的构造
  2. 贪心思想的运用
  3. 集合 api 的运用
posted @ 2019-04-15 21:20  yuzhenzero  阅读(1945)  评论(0编辑  收藏  举报