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

 

posted @ 2018-07-24 20:22  siren27  阅读(106)  评论(0编辑  收藏  举报