回溯算法篇--组合问题

129 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

1.题目一

77. 组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2

输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

示例 2:

输入:n = 1, k = 1

输出:[[1]]  

提示:

1 <= n <= 20

1 <= k <= n


思路

这题已经刷过很多遍了,最基本的dfs模板题目,

回溯法三部曲

  • 递归函数的返回值以及参数
  • 回溯函数终止条件
  • 单层搜索的过程

代码

let result = []
let path = []
var combine = function (n, k) {
    let res = [];
    let path = []
    var dfs = (index)=> {
        if(path.length == k) {
            // 这里Push的元素是一个数组,引用类型,后面path.pop后,元素又改了!!!
        // 所以这里要拷贝一份才行!!!
            res.push(path.slice())
            return
        }
        for(let i = index; i <= n; i++) {
            path.push(i)
            dfs(i + 1)
            path.pop()
        }
    }
    dfs(1)
    return res
};

1.题目二

216. 组合总和 III

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

只使用数字1到9

每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7

输出: [[1,2,4]]

解释:

1 + 2 + 4 = 7

没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9

输出: [[1,2,6], [1,3,5], [2,3,4]]

解释:

1 + 2 + 6 = 9

1 + 3 + 5 = 9

2 + 3 + 4 = 9

没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1

输出: []

解释: 不存在有效的组合。

在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。


思路 经典的回溯题了,这次又规定了不能重复,又有固定数组(1-9);可以很简单的写出来。 基本思路就是从1开始找,然后在第i个循环中从i开始,如果这个数字已经比需要的大了,直接退循环; 如果小了就是 入组->继续->复原->下一个 target在每次选择了一个数字后,减去改数字就行,不过不知道为什么时长挺长的,看了大佬有更好的方法 希望评论区告知一下


代码

var combinationSum3 = function (k, n) {
    let res = []
    let path = [];
    let sum = 0;
    const dfs = (j, sum) => {
        if(path.length > k) {
            return
        }
        if(path.length === k && sum === n) {
            res.push(path.slice())
            return
        }
        for(let i = j; i <= 9; i++) {
            if(sum + i > n) {
                continue
            }
            sum += i
            path.push(i)
            dfs(i+1, sum)
            path.pop()
            sum -= i
        }
    }
    dfs(1, 0)
    return res;
};