Skip to content

全排列

Posted on:2024年8月10日 at 17:06

给定一个不含重复数字的数组 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]]

提示:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {};

回溯 + DFS 思想

例子解析

先用 (1, 2, 3) 进行举例:

思路解析

使用编程的方法得到全排列,就是在这样的一个树形结构中完成 遍历,从树的根结点到叶子结点形成的路径就是其中一个全排列。

要注意的地方

代码解释

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {
  let len = nums.length,
    result = [],
    visited = new Array(len).fill(false);

  const dfs = (nums, len, depth, path, visited) => {
    // 遍历到叶子结点了,可以返回了
    if (depth === len) {
      result.push([...path]);
    }

    for (let i = 0; i < len; i++) {
      // 如果没遍历过
      if (!visited[i]) {
        // 压入 path 数组,然后是否遍历过的数组此下标处变为 true
        path.push(nums[i]);
        visited[i] = true;
        // 继续 dfs,直到最后一层
        dfs(nums, len, depth + 1, path, visited);
        // 进行回溯,还原,以便下一次使用
        visited[i] = false;
        path.pop();
      }
    }
  };

  dfs(nums, len, 0, [], visited);
  return result;
};
原文转自:https://fe.ecool.fun/topic/0b9c52b4-71d9-46b9-ad7e-915c8b784d15