Cracking The Coding Interview(5th ed):Chp 11,Ques 7
问题:马戏团正在设计一个由彼此站在彼此肩膀上的人组成的塔式例程。出于实际和美学的原因,每个人必须比他或她下面的人更短更轻。考虑到马戏团中每个人的身高和体重,写一个方法来计算这样一个塔中最大可能的人数。
我怀疑:
如果元素不需要保持相同(相对)顺序,那么 我们只是对数组进行排序。这使问题变得微不足道,所以 让我们假设元素需要保持在同一个亲戚身上 顺序。
以下是本书中已完成排序的代码(代码的前三行):
ArrayList<HtWt> getIncreasingSequence(ArrayList<HtWt> items)
{
Collections.sort(items);
return longestIncreaingSequence(items);
}
答案 0 :(得分:2)
建议的解决方案由两个步骤组成:
引用的句子不是第一步,而是第二步(找到最长的后续子序列),它解释说我们不能只是将高度排序,因为我们无法改变它们的顺序,因为它们是已经按重量排序。
以5个人为例看一下这个例子:
weights: 4 5 1 7 2
heights: 6 3 5 4 1
步骤1后的结果(按重量分类):
weights: 1 2 4 5 7
heights: 5 1 6 3 4
现在,从高处看,我们可以看到最长的后续序列是1 3 4
,它告诉我们解决方案由3
个人组成。为了获得这个结果,我们不能只按高度排序,因为它们已经按重量排序......
......元素需要保持相同的相对顺序。
所以我们需要使用增长最长的子序列算法。