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

力扣第四十七题——全排列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]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

完整代码

 int* vis;void backtrack(int* nums, int numSize, int** ans, int* ansSize, int idx, int* perm) {if (idx == numSize) {int* tmp = malloc(sizeof(int) * numSize);memcpy(tmp, perm, sizeof(int) * numSize);ans[(*ansSize)++] = tmp;return;}for (int i = 0; i < numSize; ++i) {if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) {continue;}perm[idx] = nums[i];vis[i] = 1;backtrack(nums, numSize, ans, ansSize, idx + 1, perm);vis[i] = 0;}
}int cmp(void* a, void* b) {return *(int*)a - *(int*)b;
}int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {int** ans = malloc(sizeof(int*) * 2001);int* perm = malloc(sizeof(int) * 2001);vis = malloc(sizeof(int) * numsSize);memset(vis, 0, sizeof(int) * numsSize);qsort(nums, numsSize, sizeof(int), cmp);*returnSize = 0;backtrack(nums, numsSize, ans, returnSize, 0, perm);*returnColumnSizes = malloc(sizeof(int) * (*returnSize));for (int i = 0; i < *returnSize; i++) {(*returnColumnSizes)[i] = numsSize;}return ans;
}

思路详解

整体思路

  1. 排序:首先对数组进行排序,以便在后续过程中可以轻松跳过重复的数字。
  2. 回溯:使用回溯算法生成所有可能的全排列。
  3. 去重:在生成全排列的过程中,通过一个布尔数组vis来标记某个数字是否已经被使用,以及通过比较相邻数字是否相等来跳过重复的排列。

详细步骤

1. 排序函数cmp
  • cmp函数是一个比较函数,用于qsort函数进行排序。它比较两个整数的值,并返回它们之间的差值。
2. 主函数permuteUnique
  • 初始化:分配内存给结果数组ans、排列数组perm和访问标记数组vis
  • 排序:调用qsort对输入数组nums进行排序。
  • 调用回溯函数:调用backtrack函数开始生成全排列。
  • 设置返回列大小:为每个排列分配列大小,即numsSize
3. 回溯函数backtrack
  • 终止条件:当idx等于numSize时,表示一个排列已经生成完毕,将其复制到结果数组ans中。
  • 遍历数组:遍历输入数组nums,尝试将每个数字放入当前排列的idx位置。
  • 剪枝:如果当前数字已经被访问过,或者当前数字与前一个数字相同且前一个数字未被访问过,则跳过当前循环,以避免生成重复的排列。
  • 递归:将当前数字标记为已访问,并将其放入排列数组perm中,然后递归调用backtrack函数处理下一个位置。
  • 撤销选择:在递归返回后,将当前数字标记为未访问,以便在后续的迭代中可以重新使用。

代码亮点

  • 去重:通过排序和比较相邻数字,巧妙地避免了生成重复的排列。
  • 回溯算法:使用回溯算法高效地生成所有可能的全排列。
  • 内存管理:动态分配和释放内存,以存储生成的排列和访问标记。

知识点精炼

  1. 排序

    • 使用qsort函数对数组进行排序,以便于后续去重操作。
  2. 回溯算法

    • 利用回溯算法遍历所有可能的组合,并在满足条件时生成全排列。
  3. 去重策略

    • 通过排序和相邻元素比较,避免在回溯过程中生成重复的排列。
  4. 布尔数组

    • 使用布尔数组vis记录每个元素是否已被使用,确保每个元素在每个排列中只出现一次。
  5. 动态内存分配

    • 动态分配内存以存储全排列结果ans、排列数组perm和访问标记数组vis
  6. 剪枝优化

    • 在回溯过程中,通过剪枝操作跳过不可能生成有效排列的分支,提高算法效率。
  7. 递归与迭代

    • 结合递归和迭代,实现深度优先搜索(DFS)来生成全排列。
  8. 内存释放

    • 在递归返回时,恢复现场,释放不必要的资源,避免内存泄漏。
  9. 比较函数

    • 实现cmp比较函数,作为qsort的参数,用于数组元素的排序。
  10. 返回值与参数

    • 通过指针参数返回全排列结果及其大小,以及每个排列的列大小。

 优化方案

去重优化

  • 排序后去重:在回溯之前先对数组进行排序,这样可以在生成排列时更容易地跳过重复的元素。
  • 位运算去重:对于小范围的整数,可以使用位运算来标记已访问的元素,减少内存使用和提高访问速度。

2. 回溯剪枝

  • 提前终止:在递归过程中,如果发现某个分支不可能生成有效排列,应立即终止该分支的递归。
  • 按字典序排列:在回溯时,保持元素按字典序排列,可以更早地发现重复并剪枝。

3. 数据结构优化

  • 原地交换:使用原地交换而非额外的数组来存储排列,可以减少内存使用和复制操作。
  • 栈代替递归:将递归改为使用栈,可以减少函数调用的开销。

4. 算法优化

  • 迭代而非递归:在某些情况下,迭代可能比递归更高效,因为它避免了函数调用的开销。
  • 分支限界:使用分支限界技术,只生成那些有希望成为有效排列的分支。

5. 并行计算

  • 多线程:对于大型问题,可以使用多线程并行生成排列的不同分支。
  • 分布式计算:将问题分割成多个子问题,在分布式系统中并行解决。

6. 编译器优化

  • 编译器优化选项:使用编译器的优化选项,如-O2或-O3,可以自动进行某些优化。

相关文章:

力扣第四十七题——全排列II

内容介绍 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],…...

Springer旗下中科院2区TOP,国人优势大!

关注GZH【欧亚科睿学术】&#xff0c;第一时间了解期刊最新动态&#xff01; 1 通信网络类 【期刊简介】IF&#xff1a;4.0-5.0&#xff0c;JCR1区&#xff0c;中科院3区 【出版社】ELSEVIER出版社 【检索情况】SCIE&EI双检&#xff0c;CCF-C类 【征稿领域】通信网络的…...

【C++】C++入门知识详解(下)

大家好~我们接着【C】C入门知识详解&#xff08;上&#xff09;-CSDN博客来介绍另一些C入门基础知识。 1.缺省值和缺省参数 缺省参数就是声明或定义函数时为函数的参数指定一个缺省参数。在调用该函数时&#xff0c;如果没有指定实参&#xff0c;则采用该形参的缺省值&#xf…...

分压电阻方式的ADC电压校准

无人机有个流程是电池电压校准。具体做法是:让你用万用表测量一下电池两端的电压,然后输入到文本框中,电机计算能重新计算出电压分压器的值,从而获得电池电压值。 这种方法实现的原理是这样的: 电阻分压检测电压原理,以上图为例: 当电路确定时,R2/(R1+R2)是一个定值R,…...

使用Postman测试API短轮询机制:深入指南

短轮询是一种Web开发中常用的技术&#xff0c;用于在客户端和服务器之间定期检查更新。与长轮询或WebSockets等技术相比&#xff0c;短轮询简单易实现&#xff0c;但可能带来较多的HTTP请求&#xff0c;从而增加服务器负担。Postman作为一个强大的API测试工具&#xff0c;可以用…...

明清进士人数数据

明清进士人数数据 指标&#xff1a;省份名称、城市名称、区县名称、明清各省进士人数、明清各城市进士人数、明清各县区进士人数 指标说明&#xff1a; Province[省份名称]-统计数据所属省份 City[城市名称]-统计数据所属地级市 Region[区县名称]-统计数据所属区县 MQpro…...

C# 串口通信(通过serialPort控件发送及接收数据)

连接串口 界面设计打开串口发送数据通过文件发送发送数据 接收数据 首先可以在 工具箱中搜索serialport&#xff0c;将控件拖到你的Winfrom窗口。 界面设计 打开串口 private void Connect_Click(object sender, EventArgs e){serialPort1.PortName comboBox2.Text;//端口名s…...

数据安全的新盾牌:SQL Server数据库镜像技术详解

数据安全的新盾牌&#xff1a;SQL Server数据库镜像技术详解 在数据驱动的商业世界中&#xff0c;数据库的安全性是维护企业运营的关键。SQL Server提供了多种数据保护机制&#xff0c;其中数据库镜像技术是一个强大的高可用性解决方案&#xff0c;它可以显著提高数据的安全性…...

【C语言版】数据结构教程(一)绪论(上)

【内容简介】本文整理数据结构&#xff08;C语言版&#xff09;相关内容的复习笔记&#xff0c;供各位朋友借鉴学习。本章内容更偏于记忆和理解&#xff0c;请读者们耐心阅读。 数据结构教程 绪论&#xff08;上&#xff09; 本节学习目标 1.1 基本概念 1.2 抽象数据类型的表示…...

酒后为什么总感觉渴?

喝酒后感到口渴&#xff0c;这种感觉其实很常见。这主要是因为酒精对我们的身体有几种影响。首先&#xff0c;酒精能够扩张血管&#xff0c;这会加快血液循环&#xff0c;让肾脏更加活跃&#xff0c;产生更多的尿液。这样一来&#xff0c;我们体内的水分就会通过排尿流失&#…...

Docker安装OwnCloud私有云盘对接ceph

一、安装OwnCloud 我的安装包链接&#xff1a;https://pan.baidu.com/s/1cJO8WEonsw4gGQWgQaYzpw?pwd6bak 提取码&#xff1a;6bak 启动OwnCloud容器&#xff0c;没有镜像会自动下载 docker run -d -p 80:80 -v /home/owncloud:/var/www/html --name owncloud --restartalway…...

创建了Vue项目,需要导入什么插件以及怎么导入

如果你不知道怎么创建Vue项目,建议可以看一看这篇文章 怎么安装Vue的环境和搭建Vue的项目-CSDN博客 1.在idea中打开目标文件 2.系在一个插件Vue.js 3.下载ELement UI 在Terminal中输入 # 切换到项目根目录 cd vueadmin-vue # 或者直接在idea中执行下面命令 # 安装element-u…...

abstract 关键字

在C#中&#xff0c;abstract 关键字是一个非常重要的特性&#xff0c;它用于定义抽象类和抽象成员&#xff08;如方法、属性、索引器、事件或操作符&#xff09;。使用 abstract 关键字的目的主要是为了提供一种机制&#xff0c;让基类能够指定一个或多个必须由派生类实现的方法…...

用Python编写你的网络监控系统详解

概要 在现代网络管理中,实时监控网络流量和状态是保证网络正常运行的关键。使用Python编写网络监控工具可以帮助管理员及时发现和解决网络问题。本文将详细介绍如何使用Python编写网络监控工具,包括基本概念、常用库及其应用场景,并提供相应的示例代码。 网络监控的基本概念…...

操作系统——虚拟内存

一、虚拟内存是什么&#xff1f; 虚拟内存类似一个桥梁&#xff0c;原来程序直接访问物理内存读取数据&#xff0c;现在程序直接访问虚拟内存&#xff0c;由虚拟内存再访问物理内存。 使用虚拟内存的好处&#xff1a; 隔离进程、提高内存使用安全性&#xff1a;每个进程直接…...

Zoom视频会议软件使用

Zoom 是一款广泛使用的视频会议软件,可以用于在线会议、网络研讨会、课堂教学、团队协作等。以下是使用 Zoom 的基本步骤和一些有用的技巧: 安装 Zoom 下载并安装: 访问 Zoom 下载页面。下载适用于你的操作系统(Windows, macOS, Linux, iOS, Android)的客户端。安装完成后…...

MVC软件设计模式及QT的MVC架构

目录 引言 一、MVC思想介绍 1.1 MCV模型概述 1.2 Excel的处理数据 1.3 MVC模式的优势 二、QT中的MVC 1.1 模型&#xff08;Model&#xff09; 1. QAbstractItemModel 2. QStringListModel 3. QStandardItemModel 4. QSqlTableModel 和 QSqlQueryModel 5. QAbstract…...

使用WSL通过SSH连接并运行图形界面程序

使用WSL通过SSH连接并运行图形界面程序 1. 在Windows上安装X服务器2. 配置并启动VcXsrv3. 在WSL Ubuntu中设置DISPLAY变量4. 从WSL Ubuntu连接到远程服务器5. 在远程服务器上设置DISPLAY变量6. 测试X11转发7. 运行您的安装程序注意事项 在Windows Subsystem for Linux (WSL) 上…...

柳湛宇-简历

...

6-1 从全连接层到卷积

我们之前讨论的多层感知机十分适合处理表格数据&#xff0c;其中行对应样本&#xff0c;列对应特征。 对于表格数据&#xff0c;我们寻找的模式可能涉及特征之间的交互&#xff0c;但是我们不能预先假设任何与特征交互相关的先验结构。 此时&#xff0c;多层感知机可能是最好的…...

【Android Studio】项目目录结构

文章目录 常用视图Android视图project视图 gradlebuild.gradleSDK 路径主题入口程序 常用视图 Android视图 project视图 gradle build.gradle SDK 路径 主题 入口程序...

electron-builder打包vue2项目问题合集

一、打包之后不显示elecmentui的图标 1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在v…...

5行代码快速Git配置ssh

0 流程步骤 检查本地主机是否已经存在ssh key生成ssh key获取ssh key公钥内容&#xff08;id_rsa.pub&#xff09;复制该内容&#xff0c;到Github账号上添加公钥&#xff0c;进入Settings设置验证是否设置成功 1 代码 # 1.检查本地主机是否已经存在ssh key cd ~/.ssh ls # …...

气相色谱检测常见问题和实战案例分享-测试狗

气相色谱检测常见问题和实战案例分享 气相色谱GC是一种高效、灵敏的分离和分析技术&#xff0c;广泛应用于石油化工、环境保护、食品安全、药物分析等领域&#xff1b;在使用气相色谱进行检测时&#xff0c;可能会遇到一些常见问题&#xff0c;本文将分享一些实战案例&#xff…...

一文学会CUDA编程:深入了解CUDA编程与架构(一)

前言&#xff1a; CUDA&#xff08;Compute Unified Device Architecture&#xff0c;统一计算设备架构&#xff09;是由NVIDIA公司开发的一种并行计算平台和编程模型。CUDA于2006年发布&#xff0c;旨在通过图形处理器&#xff08;GPU&#xff09;解决复杂的计算问题。在早期…...

Jquery判断图片加载失败,显示默认图片

//加载图片 出现404状态时触发 $(img).error(function () { //将加载不到的图片的src属性时&#xff0c;修改成默认图片&#xff0c;注意&#xff1a;默认图片必须保证存在&#xff0c;否则会一直调用此函数&#xff0c;造成死循环。$(this).attr("src", "Imag…...

App 自动化测试调研

App 自动化测试调研 App 自动化测试的价值 App 自动化测试在软件开发过程中扮演着重要的角色&#xff0c;具有以下几个方面的价值&#xff1a; 1.提高测试效率和覆盖率&#xff1a;自动化测试可以执行大量的测试用例&#xff0c;覆盖各种功能和场景&#xff0c;相比手动测试…...

Java 后端已经过时的技术,也是我逝去的青春

最近这段时间收到了一些读者的私信&#xff0c;问我某个技术要不要学&#xff0c;还有一些的同学竟然对 Java 图形化很感兴趣&#xff0c;还想找这方面的工作。 我接触 Java 已近 10多年了&#xff0c;见证了许多 Java 技术变迁&#xff0c;包括&#xff1a; JavaEE 框架&…...

释放自动化测试潜能:性能优化策略与实战技巧!

引言 在当今追求软件快速迭代的环境下&#xff0c;自动化测试的性能瓶颈正成为制约开发流程加速的主要障碍。本文将深入探讨如何通过策略和实践&#xff0c;优化自动化测试的性能&#xff0c;实现测试执行速度的质的飞跃。 自动化性能瓶颈的识别与突破 首先&#xff0c;识别并…...

如何理解代码的跨平台?

跨平台性&#xff1a; 跨平台性意味着&#xff0c;在多个平台都兼容运行 那么是怎么做到跨平台&#xff1f; 一般来说&#xff0c;window的操作系统和Linux的操作系统肯定是不一样的 那么提供的系统调用接口和诸多细节也是不一样的 但是&#xff0c;我们的c语言和c语言&#xf…...

合肥瑶海区政府网站官网/网站推广工具

1.使用服务的目的&#xff1a; 服务是为不同组件之间共享信息提供的方法&#xff0c; 如组件不应该直接获取或者保存数据&#xff0c;不应了解是否展示假数据&#xff0c; 而&#xff08;组件&#xff09;更应该聚焦数据展示&#xff0c;把数据访问的职责委托给某个服务&#x…...

云服务器怎么架设网站/seo关键词优化推广价格

在项目中会涉及到多个spring的配置文件&#xff0c;在我所接触的项目中&#xff0c;只用到了两种不同的方法进行配置&#xff0c;有其他好办法的&#xff0c;欢迎讨论。 方法一&#xff1a; 在web.xml文件中作如下配置&#xff1a; <context-param> <param-name>co…...

丽水网站建设报价/百度广告客服电话

目录 HMR是什么 使用场景 配置使用HMR 配置webpack解析webpack打包后的文件内容配置HMRHMR原理 debug服务端源码 服务端简易实现服务端调试阶段 debug客户端源码 客户端简易实现客户端调试阶段问题总结 HMR是什么 HMR即Hot Module Replacement是指当你对代码修改并保存后&…...

织梦网站被攻击/线上推广的方式

为更好地服务领军人才企业&#xff0c;使领军人才了解嘉兴新型智慧城市建设总体架构&#xff0c;积极参与嘉兴新型智慧城市建设&#xff0c;增进企业之间的合作交流&#xff0c;日前&#xff0c;由嘉兴市新型智慧城市建设领导小组办公室、嘉兴市人力资源和社会保障局、“红船服…...

泉州网站建设哪家好/百度首页

fun String?.printWithDefault(default: String) print(this ?: default);fun <T> T.easyPrint(): T {println(this)return this }fun main() {val strnull;str.printWithDefault("1324")"狗蛋".printWithDefault("1324")}...

python 做网站优势/安卓优化大师app

C从0到1全系列教程 用于比较两个表达式的值&#xff0c;运算的结果为1-true和0-false。 1、关系运算 关系数学的表示C的表示等于不等于≠!小于<<小于等于≤<大于>>大于等于≥> 注意&#xff1a; 关系运算符的两边可以是数值&#xff0c;也可以是表达式&…...