算法练习:根据身高重建队列

题目描述:

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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.首先要知道,身高比较高的人"看不见"比较矮的人,所以比较矮的人咋排列方式,不会影响身高比较高的人(太TM的真实啦)
2.所以要先排列身高比较高的人,之后再根据每个人的K值插入身高比较矮的人
3.考虑身高相同但是K值不同的人,这就很明显啦,因为身高相同的人也可以看到,所以K值较小的人在最前面

解题推算图(图片引用力扣):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题代码:

public static 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];
            }
        });
        LinkedList<int[]> list = new LinkedList<int[]>();
        for (int[] i : people) {
            list.add(i[1], i);
        }

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

知识拓展:

sort排序

1.Arrays.sort(int[] a)
对一个数组的所有元素进行排序,并且是按从小到大的顺序。
2、Arrays.sort(int[] a, int fromIndex, int toIndex)
这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序
3、public static void sort(T[] a,int fromIndex,int toIndex, Comparator c)
上面有一个拘束,就是排列顺序只能是从小到大,这个方式可以进行选择升序或者降序
4. Arrays.sort(int[] a, Comparator c)

List

LinkList
LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。

数据结构:
在这里插入图片描述

add方法
List接口中的add方法有如下两种重载方式:
① boolean add(E e);
② void add(int index, E element);
其中,方法①用于向列表的末尾插入新元素,这也是List接口中最常用的插入方法;方法②则可以在插入操作过程中指定插入的位置,此时,会自动将当前位置及只有的元素后移进行插入,需要注意的是,参数index的值不可大于当前list的容量,即在使用此方法填充一个list时,必须以0开始依次填充。

第二种方法的源码如下:

 public void add(int index, E element) {
        checkPositionIndex(index);

        if (index == size)
            linkLast(element);
        else
            linkBefore(element, node(index));
    }


 void linkBefore(E e, Node<E> succ) {
        // assert succ != null;
        final Node<E> pred = succ.prev;
        final Node<E> newNode = new Node<>(pred, e, succ);
        succ.prev = newNode;
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        size++;
        modCount++;
    }

实例如下:
在这里插入图片描述
在这里插入图片描述

个人收获:

该题主要有两天:1.排列的算法,因为高人看不到矮人,所以先排高人,再排矮人 2.找到合适的数据结构来实现算法,能够直接插入到某一个指定的位置
一直使用List,但是没有注意过他的add方法,这一次练习,我觉得还有很多东西要学,掌握的越多,实现算法就会越简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值