【发布时间】:2013-07-21 20:18:00
【问题描述】:
在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) 如果下一件物品的身高和体重不大于上一件物品,我们将该物品标记为“不合适”
c) 如果找到的序列的项数超过“最大序列”,则变为“最大序列”
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) 的解决方案吗?
【问题讨论】:
-
澄清。步骤 b 说“......标记这个项目......”但是“这个”项目是步骤第一部分的“上一个”还是“下一个”项目?其次,如果你发现一个“不合适”的项目,它会被跳过吗?它会结束序列吗?我也不明白步骤 D 中的“搜索重复”是什么意思。
-
该算法可能正确,也可能不正确,但它的描述方式似乎使它不受大多数理解它的尝试的影响......如果这是书中的逐字记录,我会摆脱它.
-
与 JacobRaihle 所说的相呼应,那本书似乎没有经过很好的校对。我记得阅读前几章并在发现的解决方案/边缘案例中发现了一些错误。它很好地概述了你应该在准备中涵盖的主题,但它所涵盖的任何信息似乎都不是特别权威。
-
每当我需要在 C# 中实现 IComparable 方法 ToCompare 时遇到问题,应该返回一个 int,以检查两个对象是否比彼此更高、更小或更大,以定义比较标准, 因为你可以有 5 个选项:(H1 > H2 and W1 H2 and W1 > W2), (H1 W2), (H1 == H2 和 W1 == W2)
标签: algorithm sorting dynamic-programming