在Cracking the Coding Interview, Fourth Edition中,有这样一个问题:
一个马戏团正在设计一个由站在另一个人肩膀上的人组成的塔式例程 出于实用和美观的原因,每个人都必须比他或她下面的人更矮更轻 鉴于马戏团中每个人的身高和体重,编写一个方法来计算在这样一个塔中的最大可能人数。
示例:输入 (ht, wt): (65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110)
输出:最长的塔长为 6,从上到下包括: (56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)
这是书中的解决方案
Step 1 所有物品先按高度排序,再按重量排序 这表示如果所有高度都是唯一的,则按高度排序 如果高度相同,则按重量排序
步骤 2 找到包含增加高度和增加权重的最长序列为此,我们:
a) 从序列的开头开始 目前,max_sequence 为空
b) 如果下一件物品的身高和体重不大于上一件物品,我们将该物品标记为“不合适”</p>
c) 如果找到的序列的项数超过“最大序列”,则变为“最大序列”</p>
d) 之后从“不合适的项目”开始重复搜索,直到我们到达原始序列的末尾
我对其解决方案有一些疑问。
第一季度
我相信这个解决方案是错误的。
例如
(3,2) (5,9) (6,7) (7,8)
显然,(6,7)
是一个不合适的项目,但怎么样(7,8)
?根据解决方案,它不是不合适的,因为它的 h 和 w 都比 大(6,7)
,但是,它不能被考虑到序列中,因为(7,8)
不适合(5,9)
。
我对吗?
如果我是对的,解决方法是什么?
第二季度
我相信即使有上述解决方案的修复,解决方案的风格至少会导致O(n^2)
,因为它需要一次又一次地迭代,根据步骤 2-d。
那么是否有可能有一个 O(nlogn) 解决方案?