上一篇写了使用回溯法解决的几道题,这几天又把其他的回溯法的题做了一下。在这里总结一下。由于题目较多,就单独沾代码了,开链接直接看。
从题目要求上来说,主要分为三类:
- 查找,这类题一般要我们找出所有满足条件的情况,返回一个集合。结果集合作为递归函数的一个参数进行传递。如51. N-Queens,131. Palindrome Partitioning,93. Restore IP Addresses,Combination Sum1&2&3,subset、subset2与combination相似,22. Generate Parentheses
- 计数,这类题会让我们计数符合条件的所有情况,要求返回一个数值。其实套路与查找类型的一致,只是变量的处理上有一点不同。一般需要一个全局变量来计数,这个变量不作为递归函数的参数传递。52. N-Queens II,377. Combination Sum IV(这道题用回溯法是超时的,应该用dp,这里放过来只是为了介绍这种类型的题)
- 判断,判断是否可以找到符合条件的情况。79. Word Search,37. Sudoku Solver。这种类型的题递归函数的返回值一般是boolean的。
另外几点:
- 一般不超过三个函数,主函数,递归函数,有的题目还需要一个判断函数,用来判断放置的位置是否符合条件。如52. N-Queens II,37. Sudoku Solver
- 特别要想清楚的是递归函数需要几个参数,一般来说有这几个:给定背景参数(棋盘,给定数组等),最终结果集合参数(计数类的题不需要),暂时结果参数,当前位置参数等等
- 返回条件,一般在递归函数的一开始进行判断返回。另外也要注意在循环结束时候的返回
- 回溯法的重点在递归函数,他的递归函数一般是循环和递归的结合。对于查找类型,在递归完成后要清除templist的最后一个元素;对于计数类型的,不需要,直接返回就行了。