最长递增子序列(动态规划)
前言
为了更方便理解最长递增子序列。所以学习并总结的博客
最长递增子序列
一下是个人总结和觉得重要的知识点
子序列
:不一定是连续的
字串
:一定是连续的
假设一个数组 nums
,dp[i]
表示以 nums[i]
这个数结尾的最长递增子序列的长度。
1 | let nums=[1,4,3,4,2] |
这个 GIF 展示了算法演进的过程:
根据这个定义,我们的最终结果(子序列的最大长度)应该是 dp 数组中的最大值。
1 | int res = 0; |
那么如何归纳呢 假设我们已经知道了 dp[0..4] 的所有结果,我们如何通过这些已知结果推出 dp[5] 呢?
1 | let nums=[1,4,3,4,2,3] |
nums[5] = 3,既然是递增子序列,我们只要找到前面那些结尾比 3 小的子序列,然后把 3 接到这些子序列末尾,就可以形成一个新的递增子序列,而且这个新的子序列长度加一。
nums[5] 前面有哪些元素小于 nums[5]?这个好算,用 for 循环比较一波就能把这些元素找出来。
1 | // i 为当前我所需要算的db索引 |
如上所述,通过归纳法我们已近总结出了算法逻辑了
1 | function lengthOfLIS(nums:Number[]) { |