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

news/2024/11/6 2:30:19/

文章目录

    • 全排列 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.ppmy.cn/news/1544695.html

相关文章

手提吊钩秤方案的ADC芯片选型

在当今的计量领域&#xff0c;手提吊钩秤以其便携性和高效性成为了众多行业不可或缺的工具。而在手提吊钩秤方案中&#xff0c;ADC 芯片 CS1237 发挥着至关重要的作用。它以其卓越的性能和精准的测量能力&#xff0c;为手提吊钩秤的准确性和可靠性提供了坚实的保障。 一、手提吊…

R使用ggplot实现基础数据可视化

0. 在开始之前&#xff0c;我们需要设置工作目录并导入数据集 liver.df 作为案例示范&#xff0c;如果需要liver.df可以评论。 # set your own working directory! setwd("liver_files_location")liver.cells.df <- read.table("liver.cells.txt", he…

RK3568平台开发系列讲解(字符设备驱动篇)注册字符设备

🚀返回专栏总目录 文章目录 一、字符设备初始化二、字符设备的注册和注销沉淀、分享、成长,让自己和他人都能有所收获!😄 📢注册字符设备可以分为两个步骤: 字符设备初始化字符设备的添加一、字符设备初始化 字符设备初始化所用到的函数为 cdev_init(…),在对该函数讲…

网络层6——内部网关协议RIP、OSPF(重点)

目录 一、基本概念 1、理想的路由算法应具备的特点 2、分层次的路由选择协议 二、内部网关协议RIP 1、特点 2、路由交换信息 3、距离向量算法 4、坏消息传送慢问题 5、RIP报文格式 三、内部网关协议OSPF 1、特点 2、其他特点 3、自治系统区域划分 4、OSPF的5中分…

第一章 Linux安装 -- 安装Ubuntu 24.04操作系统(三)

文章目录 2.3.3 安装Ubuntu 24.04操作系统 2.3.3 安装Ubuntu 24.04操作系统 虚拟机的创建参照前面2.3.1.3节里的步骤创建&#xff0c;这里不再详述。Ubuntu 20.04/22.04安装方法大致相同&#xff0c;参考Ubuntu 24.04安装方法。 下面就开始安装Ubuntu 24.04系统了&#xff0c;…

高科技行业知识库搭建:驱动创新与效率的双引擎

在高科技行业&#xff0c;知识密集型工作是企业竞争力的核心所在。随着技术的飞速发展和市场竞争的日益激烈&#xff0c;如何高效地管理和利用知识资源&#xff0c;成为高科技企业面临的重要挑战。知识库作为知识管理的核心工具&#xff0c;正逐渐成为驱动高科技行业创新与效率…

使用Flask构建RESTful API

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Flask构建RESTful API Flask简介 环境搭建 安装Flask 项目结构 创建应用 路由定义 请求处理 获取查询参数 获取请求体 响应…

大型语言模型(LLM)的小型化研究进展

2024年&#xff0c;大型语言模型&#xff08;LLM&#xff09;的小型化研究取得了显著进展&#xff0c;主要采用以下几种方法实现&#xff1a; 模型融合&#xff1a;通过将多个模型或检查点合并为一个单一模型&#xff0c;减少资源消耗并提升整体性能。例如&#xff0c;《WARM: …