当前位置: 首页 > article >正文

学习记录: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

http://www.kler.cn/a/380873.html

相关文章:

  • 软件设计与体系结构
  • Unity中有什么情况下是需要用UniTask替代其他异步方式的吗?
  • JavaWeb期末复习(习题)
  • 使用CNN模型训练图片识别(键盘,椅子,眼镜,水杯,鼠标)
  • Pytorch | 从零构建Vgg对CIFAR10进行分类
  • harmony UI组件学习(1)
  • 棋牌游戏防ddos攻击,高防IP好用吗?
  • IO流篇(一、File)
  • 承建网站提高访问者留存率
  • 对于IIC的理解
  • Python小白学习教程从入门到入坑------第二十六课 单例模式(语法进阶)
  • 探索Java与C++中的类成员访问修饰符:从默认设置到封装实践
  • 【系统架构设计师】预测试卷一:论文(包括4篇论文主题对应的写作要点分析)
  • AUTOSAR COM 与 LargeDataCOM 模块解析及 C++ 实现示例
  • Docker:容器编排 Docker Compose
  • WPF中的CommandParameter如何使用
  • 11.04学习
  • 《Python游戏编程入门》注-第4章7
  • 如何封装一个axios,封装axios有哪些好处
  • PHP露营地管理平台小程序系统源码
  • Vue3-hooks代替mixins
  • 20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速
  • 【GL09】(算法)卡尔曼滤波
  • HCIA(DHCP服务)
  • C++优选算法七 分治-快排
  • 江协科技STM32学习- P29 实验- 串口收发HEX数据包/文本数据包