方法论
递归法
首先找出问题的基本解(base case) , 再将一个问题通过分类的方法,使之化为一个个更小的问题的问题的组合。
比方说,我们找到了知道 base case f(0) = 0
然后知道 f(n) = f(n - 1) + 1
这种情况就可以通过递归来解。这有点像数学归纳法。
但是递归法解决常常会进行很多重复的计算,例如在使用递归法计算斐波那契数列的问题的时候。而且如果递归太深会有爆栈的可能。
动态规划
真是由于上面的问题,我们可以顺着来,与递归法的那种从目标结果推到基础解 (base case) 的情况不同。我们可以从 (base case) 推到目标解。为了避免重复的计算,我们可以将中间的结果保留在想数组一样的额外存储空间里。
字符串的匹配问题是较为经典的可以用动态规划解决的问题。一般步骤就是先建立一个辅助的二维数组。然后前面的数据去退出 arr[i][j]
。
有一点递归会比动态规划好,那就是递归每次可以根据情况每次的退化的 K,这个 K 可以是一个变量。而动态规划的每次前进 J 步,这个 J 一般都是一个定值。
双指针
双指针常见的用法是和排序结合。是一种贪心算法,是的搜索有方向。