LeetCode 题解:77. 组合,回溯 +for 循环,JavaScript,详细注释
原题链接:https://leetcode-cn.com/problems/combinations/
解题思路:
该解法参考了46. 全排列的解法[LeetCode 题解:46. 全排列,回溯,JavaScript,详细注释](https://leetcode-cn.com/problems/permutations/solution/leetcodeti-jie-46-quan-pai-lie-hui-su-javascriptxi/)。
使用DFS生成所有可能的排列情况。
需要使用 used 数组,标识每个值是否被使用过,同时 used 的 index 即为需要排列的数字。
清除状态的注意点:
* 由于 subResult 和 used 变量会在每次递归被重复使用,需要注意每次递归后恢复当前状态。
* 以输入: n = 4, k = 2
为例,假设是第一层递归,for 循环清除状态后每次得到的 subResult 分别为[1]
、[2]
、 [3]
、[4]
, used 分别为[false, true, false, false, false]
、[false, false, true, false, false]
、[false, false, false, true, false]
、[false, false, false, false, true]
。
* 也就是说,当 subResult 为[2]时,上一次循环中所有可能的排列情况都已被输出,而且 used 所有被使用过的状态都被清除,不会影响当前的递归。
* 当循环遇到已经使用过的数字,则需要跳过,避免重复排列。
递归终止时,由于 subResult 只是一个引用,即它的值会随着函数的运行不断改变,因此需要将其 copy 一份,否则最终输出的结果都会是
[]
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/d4949bec6ec20b48ad3187927】。文章转载请联系作者。
评论