一、组合问题
1. N个数中取k个
终止条件:path中元素个数等于k个
要设startindex
2. 组合总和
(1) 第一种
题目特征:限制了每个组合中数的个数,每种组合中不存在重复的数字,即每个数只能用一次
终止条件:path中元素之和大于targetsum时直接返回,元素个数达到要求时,且path中元素之和等于targetsum时终止
要设startindex
(2) 第二种
题目特征:每个组合中数的个数不确定,集合中的元素可以重复取用
终止条件:path中元素之和大于targetsum时直接返回,path中元素之和等于targetsum时终止
要设startindex,但是递归时要依然从i开始(因为元素可以重复取用)
(3) 第三种
题目特征:集合中元素不能重复使用,但集合中可能含有重复元素,最终的结果中不能包含重复的组合。
终止条件:path中元素之和大于targetsum时直接返回,元素个数达到要求时,且path中元素之和等于targetsum时终止
要设startindex
要用used去重(树层上的去重),去重记得排序
3. 多个集合求组合
题目特征:给定的是多个独立的集合,每次从不同的集合中分别取一个数
终止条件:遍历完集合序号
不要设startindex,递归起点都是0开始
二、切割问题
比较难
终止条件:切割线切到了字符串最后
要设startindex
startindex就是切割线
[startIndex, i] 就是要截取的子串
三、子集问题
子集问题中,每个节点都要收集!
1. 集合不含重复元素
要设startindex
终止条件:startIndex已经大于数组的长度了(可以不写)
2. 集合中可能含重复元素
1的基础上加上去重
3. 递增子序列
(给定数组中可能包含重复数字)
终止条件同上
不能用used去重,因为要求递增子序列,就不能排序了,只能用set或nums来记录树层中哪个用过哪个没用过
遇到非递增了或者元素用过了就跳过
四、排列
1. 没有重复数字的序列
终止条件:path的大小和nums数组一样大的时候
不设startindex
要用used来记录取过的元素(先取一个,然后没被取到的当中再取一个...)
2. 有重复数字的序列
1加上去重
先写这么多,棋盘问题还没看呢