LC-46. 全排列

136 阅读1分钟

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

题目描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入: nums = [0,1]
输出: [[0,1],[1,0]]

示例 3:

输入: nums = [1]
输出: [[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

题解

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

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

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

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

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

  • 子集问题

  • 棋盘问题,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
}

总结

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