LeetCode 406.Queue Reconstruction by Height

匿名 (未验证) 提交于 2019-12-03 00:43:02

我们先来看题目描述:

(h, k)hkh. 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也应该尽量小。所以我们优先选择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

原文:https://www.cnblogs.com/siren27/p/9362379.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!