基于多个字段在用户定义的对象数组中查找LIS

时间:2017-06-05 07:31:13

标签: java

Cracking The Coding Interview(5th ed):Chp 11,Ques 7

问题:马戏团正在设计一个由彼此站在彼此肩膀上的人组成的塔式例程。出于实际和美学的原因,每个人必须比他或她下面的人更短更轻。考虑到马戏团中每个人的身高和体重,写一个方法来计算这样一个塔中最大可能的人数。

我怀疑:

  • 在书中给出的解决方案中,文中明确提到了这一点 对元素进行排序会使解决方案变得微不足道 元素最初是在代码中排序的?
  

如果元素不需要保持相同(相对)顺序,那么   我们只是对数组进行排序。这使问题变得微不足道,所以   让我们假设元素需要保持在同一个亲戚身上   顺序。

以下是本书中已完成排序的代码(代码的前三行):

    ArrayList<HtWt> getIncreasingSequence(ArrayList<HtWt> items)    
    {     
       Collections.sort(items);    
        return longestIncreaingSequence(items);    
    }

1 个答案:

答案 0 :(得分:2)

建议的解决方案由两个步骤组成:

  1. 按重量排序
  2. 找到高度上增长最长的子序列
  3. 引用的句子不是第一步,而是第二步(找到最长的后续子序列),它解释说我们不能只是将高度排序,因为我们无法改变它们的顺序,因为它们是已经按重量排序。

    以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个人组成。为了获得这个结果,我们不能只按高度排序,因为它们已经按重量排序......

      

    ......元素需要保持相同的相对顺序。

    所以我们需要使用增长最长的子序列算法。