• 【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 的运用
  • 相关阅读:
    织梦精准搜索自定义字段搜索证书查询
    织梦一个标签获取当前链接url(首页/列表页/列表分页/内容页/内容页分页)
    织梦dede:arclist按最新修改排序orderby=pubdate无效的解决方法
    织梦likearticle让mytypeid支持多个栏目和子栏目
    织梦站内选择和文件管理器中文乱码的解决方法(utf8编码程序包才会)
    WPFDispatcher示例
    WPF 核心体系结构
    WPF扩展标记
    WPF 路由事件
    WPF 自定义路由事件
  • 原文地址:https://www.cnblogs.com/yuzhenzero/p/10713249.html
Copyright © 2020-2023  润新知