返回

LeetCode 77:组合 - 逻辑清晰,轻松掌握

闲谈

引言

LeetCode 77:组合 是一个经典的算法问题,要求你生成所有从 1 到 n 中选取 k 个数的组合。虽然问题看似简单,但背后的算法思想却非常巧妙。本文将深入浅出地解析这个问题的解决方案,并用通俗易懂的语言讲解递归和回溯算法在其中的应用。

递归与回溯

要解决这个问题,我们需要借助递归和回溯两种算法思想。递归是一种将问题分解为更小规模的相同问题的算法,而回溯则是一种在探索过程中回溯到之前状态的算法。

算法步骤

以下是用递归和回溯解决 LeetCode 77:组合 问题的详细步骤:

  1. 定义一个函数 generateCombinations,它接收三个参数:n(元素总数)、k(要选择的元素个数)和一个空数组 res,用于存储所有组合。
  2. 在函数中,定义一个一维数组 oneCombination,用于存储当前组合。
  3. 1n 遍历每个元素。
  4. 如果 oneCombination 中的元素个数小于 k,将当前元素添加到 oneCombination 中,并递归调用 generateCombinations 函数,但将 startPos 设置为当前元素的索引加 1。
  5. 如果 oneCombination 中的元素个数等于 k,表示找到了一种组合,将其添加到 res 中。
  6. 递归调用结束后,返回 res

JavaScript 代码实现

const generateCombinations = (n, k, startPos = 1, oneCombination = [], res = []) => {
  if (oneCombination.length === k) {
    res.push([...oneCombination]);
    return;
  }
  for (let i = startPos; i <= n; i++) {
    oneCombination.push(i);
    generateCombinations(n, k, i + 1, oneCombination, res);
    oneCombination.pop();
  }
  return res;
};

示例

假设 n = 4k = 2,则该算法将生成以下组合:

[1, 2]
[1, 3]
[1, 4]
[2, 3]
[2, 4]
[3, 4]

总结

通过利用递归和回溯算法,我们可以巧妙地解决 LeetCode 77:组合 问题。这种算法思想在解决许多其他算法问题中也发挥着重要作用。掌握了这一思想,你将大大提升解决算法问题的效率和思维广度。