四数之和之递归思路
在leetcode刷到两数之和、三数之和、四数之和的问题,发现题解都在使用滑动窗口、双指针的方法,在此补充一下递归与递推的解题思路(因为我的解题思路都是思考解空间-遍历解空间-聪明的遍历解空间-发现方法到达优化瓶颈,再思考其它方式如双指针、hash等,对递归和递推总有执念)。 注:递归解法往往效率不高,本文仅是给出以递归的思路思考问题的过程以供参考,并不是题目的最优解法。 已中间的四数之和为例,我们先看题目: 题目中不难发现,问题本身是带有递归结构的。可以用递归解决的问题大致包含以下三类: (1)多重循环(递归层数不确定):N皇后问题 (2)本身用递归形式定义的问题:阶乘、波兰表达式 (3)将问题分解成规模更小的子问题:汉诺塔 我们在定义函数时,如果确定了问题具有递归结构,只需考虑回归条件和每一层与下层的关系, 状态转移方程就是描述相邻层级间关系的函数,即如何用小问题的解来解决相邻层级的高层问题 。我们定义函数f(x,target)为输出目标数组中x个和为target的元素,那么,f(4)与f(3)的关系为: f(3)与f(2)的关系为: f(n)与f(n-1)的关系为: 将状态转移方程用伪代码描述(不太喜欢内嵌代码的风格,完整代码在文末提供): 状态转移方程有了,我们还需要思考一下递归的回归条件