39. 组合总和、40. 组合总和 II_清榎的博客-CSDN博客
77. 组合、216. 组合总和 III、17. 电话号码的字母组合_清榎的博客-CSDN博客
这几道组合问题中需要注意几个点
数量要求,能否无限重复,有无总和的限制
思路其实都很相似,回溯,抽象为一棵树。
startIndex来控制for循环的起始位置,对于组合问题,什么时候需要startIndex呢?
如果是一个集合来求组合的话,就需要startIndex,例如:39.组合总和、77.组合。
如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:17.电话号码的字母组合
在求和问题中,排序之后加剪枝是常见的套路!
40. 组合总和 II
这个题中的去重办法十分值得思考,如何进行的同层去重。
当然去重时还可以采用一个used数组进行标记:
“树枝去重”和“树层去重”。
都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。
在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下:
- used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
- used[i - 1] == false,说明同一树层candidates[i - 1]使用过
131. 分割回文串、93. 复原 IP 地址(切割问题)_清榎的博客-CSDN博客
切割问题主要有如下几个难点:
- 切割问题其实类似组合问题
- 如何模拟那些切割线
- 切割问题中递归如何终止
- 在递归循环中如何截取子串
- 如何判断回文
- 如何判断子串是否合法