动态规划系列 - 找递增序列的长度 - 算法与数据结构面试分享(二十七)
Posted 算法与数据结构面试辅导
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划系列 - 找递增序列的长度 - 算法与数据结构面试分享(二十七)相关的知识,希望对你有一定的参考价值。
点击蓝字
动态规划系列 - 找递增序列的长度
01
细化问题
我们先把这道题细化一下,假设有一个整型数组, a1, a2, a3,...an, 我们需要找到一个递增序列 ai, aj, ak...使得 i<j<k 并且 ai<aj<ak, 那么i, j, k等就算是递增序列里的元素,而递增序列的长度取决于i,j,k的数列。 那么大家心里可能会有一些疑问了?
递增序列是连续递增吗? 例子中的i,j,k需要连续吗?
不需要哈
高晓明
我们需要把原数组划分为若干个子数组,然后求出递增序列吗?
不需要啊,这样基本无解
我们扩展一下,如果要我们求出这个递增数组,我们能做吗?
可以的哈,不过我们先得解决当前的问题
02
继续分析
假设我们知道了到ai为止,之前的递增序列长度,我们只需要把当前的aj与ai去比较哈,并记录住ai的递增长度加1,我们记录下来,再和a[i-1]去比对吧?当然,如果a[j] > a[i-1]我们还需要把刚在记录的长度去和a[i-1]所在的递增序列长度去比较,对吧?这样的比较到什么时候为止呢?应该是到a[0] 个元素,这样我们才能保证没有元素遗漏掉。此处,大家要注意哈,不是找到最大的元素就结束了哈。
03
挖掘本质再解题
如何记录当前元素及之前的序列中,递增序列的长度呢?核心问题是,每个元素似乎都要记录下来。那我们就想到了计数排序里的签到表。什么一个新的数组,和之前的数组长度一样,默认值都是0(此处,我们应该至少返回1哈,大家会看到我们代码的处理里加了1才能理解)。
这一题的本质,其实是一维的动态规划哈。接下来的篇章里我们会逐渐讨论动态规划(DP)的问题。
04
一起写代码
05
我们一起测试一下
06
Workthrough
1. 10 - 递增长度应该是 1, 只有一个元素啊,所以大家看到上面的结果返回0
2. 10, 100 - 递增长度应该是2, 对于100来说。 两个元素确实是递增的,所以大家看到了上面的结果返回1
3. 10, 100, 20 - 递增长度是2, 对于20来说。递增序列是10, 20. 所以大家看到了上面的结果返回1
4. 10, 100, 20, 15 - 递增长度是2, 对于15来说。递增序列是10, 15,所以大家看到上面的结果返回1
5. 10, 100, 20, 15, 20 - 递增长度是3,对于20来说。递增序列是10,15,20, 所以大家看到上面返回的结果2
6. 10, 100, 20, 15, 20, 16 - 递增长度是3. 对于16来说,递增序列是 20, 15,16,所以大家看到上面的结果返回2
大家就按照这个思路继续往下哈。相信大家能够很快理解为什么最大递增长度是7了。
点击“阅读原文”打开新页面
以上是关于动态规划系列 - 找递增序列的长度 - 算法与数据结构面试分享(二十七)的主要内容,如果未能解决你的问题,请参考以下文章
算法 ---- 子序列系列问题题解(子序列编辑距离回文系列问题)