LC-77. 组合

97 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

给定两个整数 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

题解

回溯通常是一种纯暴力的搜索方式,一般和 递归 是绑在一起出现的

这里只要涉及到以下几种方式,都可以通过回溯法来进行处理和解决。

  • 组合,只要包含即可,通常是无序的

  • 排列,是有顺序可言的,与组合刚好不同

  • 字符串切割,得到的子串怎么怎么样

  • 子集问题

  • 棋盘问题,N皇后,解数独

回溯

关于这道题,我们可以先进行画出一个 树的结构 来查看。

image.png

注意我们递归时传递的参数,只需要传递每次开始的值 和 当前数组。

每次判断数组的长度是否 === k,来将值,push 到res中进行保存。

之后的每次push完后,需要再进行弹出操作

const combine = (n, k) => {
  const res = []

  const search = (start, arr) => {
    if (arr.length === k) {
      res.push([...arr])
      return
    }

    for (let i = start; i <= n; i++) {
      arr.push(i)

      search(i + 1, arr)

      // 每次push完后,再进行弹出操作
      arr.pop()
    }
  }

  search(1, [])

  return res
}

总结

题目 17 :组合 在 回溯方法中的使用。一般通过画出树结构,可以清晰的解决此类问题。