LeetCode 406.Queue Reconstruction by Height

Posted siren27

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 406.Queue Reconstruction by Height相关的知识,希望对你有一定的参考价值。

我们先来看题目描述:

Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k), where h is the height of the person and k is the number of people in front of this person who have a height greater than or equal to h. Write an algorithm to reconstruct the queue.

Note:
The number of people is less than 1,100.

Example:

Input:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

Output:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

意思很清楚,以二维数组的形式给出一组数对(h,k),对这组数对重新排列使得对于这个排列中任意一个数对A(h,k),排在A之前的 h>= A.h 的数对数目,与A..k相等。

 

  分析题目我们可以知道:在对于一个数对的重新排序中,我们可以不同考虑h大于该数对的数对。而且由于存在k=0的数对,我们可以先对k = 0的的数对进行排列,也就是对所有k = 0的数对按照h的值进行升序排列,然后再选择出数对,插入到已经排好的数对中。

 

但是怎么选择数对呢,我们这里可以采用贪心的思想,因为h 比较大的数对需要考虑的数对就越少,又要考虑到k也应该尽量小。所以我们优先选择h尽量大,而且k尽量小的数对。更通俗一点的理解,如果我们没有选择h最大的数对,先考虑了h较小的数据对。那么我们再插入较大的数据对的时候,如果插入到这个比较小的数对之前,我们就要去考虑是否还匹配之前小一些数对的k值。为了避免这种重复,我们选择max(h),min(k)的贪心方法。

 

确定如何选取数对之后,处理就变得简单了。只需要从前向后遍历,找到应该插入的位置就好了。

 

缺点就是时间复杂度比较高,实现时图方便把确定插入顺序的函数写入了循环之中,没有进行摊还分析,但至少到了o(n3),下次优化一下。

附java源码链接:

https://github.com/1163710128/LeetCode/blob/master/LeetCode406QueneReconstructionByHeight.java

 


以上是关于LeetCode 406.Queue Reconstruction by Height的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 406.Queue Reconstruction by Height

[LeetCode] 406. Queue Reconstruction by Height(按身高重排队列)

LeetCode 406.Queue Reconstruction by Height

LeetCode 406. Queue Reconstruction by Height

LeetCode 406. Queue Reconstruction by Height

leetcode 406. Queue Reconstruction by Height 根据身高重建队列(中等)