欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 学习记录:js算法(八十六):全排列 II

学习记录:js算法(八十六):全排列 II

2025/4/4 23:49:22 来源:https://blog.csdn.net/weixin_48677331/article/details/143529979  浏览:    关键词:学习记录:js算法(八十六):全排列 II

文章目录

    • 全排列 II
      • 思路一

全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

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

思路一

function permuteUnique(nums) {nums.sort((a, b) => a - b); // 1. 排序以避免重复const results = []; //  存储结果const backtrack = (path, options) => { // 2. 递归函数if (options.length === 0) { // 3. 基本结束条件results.push(path);return;}for (let i = 0; i < options.length; i++) {// 4. 回溯过程: 跳过重复元素if (i > 0 && options[i] === options[i - 1]) continue;const newPath = [...path, options[i]]; // 5.1 添加到路径const newOptions = [...options.slice(0, i), ...options.slice(i + 1)]; // 5.2 移除当前数字backtrack(newPath, newOptions); // 5.3 递归调用}};backtrack([], nums); // 5. 开始回溯return results; // 6. 返回结果
}

讲解
我们需要找到所有不重复的全排列,考虑到序列中可能包含重复的数字,我们需要在递归过程中避免生成重复的排列。

  1. 排序:首先对输入数组 nums 进行排序。这样可以帮助我们在递归过程中跳过重复的元素。
  2. 递归函数:
    ○ 定义一个递归函数 backtrack,它接受两个参数:
    path: 当前正在构建的排列。
    options: 剩余可选数字的集合。
  3. 基本结束条件:
    ○ 如果 options 集合为空,这意味着我们已经选择了一个全排列。
    ○ 此时将当前路径 path 加入结果数组 results,然后返回。
  4. 回溯过程:
    ○ 对于 options 集合中的每一个数字,执行以下操作:
    ■ 如果当前数字与前一个数字相同(且前一个数字已经被考虑过),则跳过当前数字以避免重复。
    ■ 将当前数字添加到路径 path 中。
    ■ 从 options 集合中移除当前数字。
    ■ 递归调用 backtrack 函数,传递更新后的 pathoptions
    ■ 回溯,即将当前数字从路径 path 中移除。
  5. 开始回溯:
    ○ 调用 backtrack 函数,传入初始的 pathoptions(即 nums)。
  6. 返回结果:
    ○ 使用一个数组来存储所有不重复的全排列。最后返回结果数组 results

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词