zoukankan      html  css  js  c++  java
  • 【LeetCode】406-根据身高重建队列


    title: 406-根据身高重建队列
    date: 2019-04-15 21:13:06
    categories: LeetCode
    tags:

    • Java容器
    • 比较器
    • 贪心思想

    题目描述

    假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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 的运用
  • 相关阅读:
    Spring Cloud(三):Web服务客户端之Feign
    Spring Cloud(二):Web服务客户端之Ribbon
    Spring Cloud(一):服务注册中心Eureka
    细说Ansible主机清单inventory
    Ansible配置文件ansible.cfg详解
    CentOS 7离线安装Ansible
    Java中的异常处理
    PyQt5Day33--自定义信号+动画
    8. matlab图像处理基础——边缘检测+形态学变换+图像增强
    7. matlab图像处理基础——几何变换+正交变换
  • 原文地址:https://www.cnblogs.com/yuzhenzero/p/10713249.html
Copyright © 2011-2022 走看看