上周在接受采访时,我被问到上面的问题,正如预期的那样,我无法正确回答,后来当我查看时,我看到它是一个基于动态编程的算法。我不熟悉动态编程,但是假设我要设计这个算法然后我该如何处理呢?
假设,我从其他划分和征服算法(如MergeSort)中获取想法,并设计解决方案如下:
显然有缺失的部分,但是从这里如何向前推进?
答案 0 :(得分:1)
你的提议不起作用,因为两半中最长的序列通常不会是连续的,并且当你加入一半时可能存在更长的序列。
您可以按照以下方式解决此问题:
在两半中,找到最长的增长子序列,右对齐,让LR和RR;
最长,如果后者形成递增序列,则保留L,R,LR + RL中最长的;
所有这些操作都在一个递归过程中完成。当你连接两个子序列时,检查它们是否形成一个增加的子序列只需要比较面对的元素。