1 回顾
利用了6天时间,细细总结了8个常用排序算法的原理到源码兑现,如果您对排序算法感兴趣或者想了解这些算法用到的思想,比如分治法,递归调用,堆排序等,然后尽量学着将这些思想用到工作的coding中去,请参考之前推送:
2 你会学到什么?
接下来,要学习一种算法优化的思路。
暴力枚举,一般比较容易想出来,是解决问题最直接的方法,但是往往不是高效的算法,找出暴力枚举的问题所在,以此为突破口,才有可能想出更高效的算法。
这种更高效的算法有可能是动态规划。看看如何通过实战从暴力枚举切入到动态规划中。
3 讨论的问题是什么?
已知目标函数,和多个输入变量,并且输入变量间有耦合关系,对于这类问题,暴力解决一般时间复杂度比较大,讨论动态规划来降低时间复杂度。
4 动态规划入门
先考虑这么一个问题,给定两个数组a和 b,每个数组任意拿出一个元素,求乘积的最大值,假定数组 a 和 b 相互独立,不存在耦合关系。
在这个假定下,这个问题变得就很简单了,直接取各自数组a或b的最大值,两者相乘一定是最大值。
但是,有时候,数组a和b不会相互独立,存在耦合关系,例如数组a中最大元素取出后,就不能再拿数组b中的最大值了,此时问题就好像变得复杂起来。
这就是我们说的需要规划,需要有策略的动态地调整数组a和b拿出的元素,最后的相乘最大值,可能都不是各自的最大元素。
上述问题,转化为一个实际问题,便是LeetCode的第11题 container with most water,请看题,
Given n non-negative integers a1, a2, …, an, where each represents