46. 全排列

计算数组的全排列

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

提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数互不相同

代码

完整代码

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>void dfs(int* nums, bool* isUsed, int** answer, int ansIndexNow, int numsSize, int* thisTurnArr, int* resRowIndex)
{if (numsSize == ansIndexNow){answer[*resRowIndex] = (int*)calloc(numsSize, sizeof(int));for (int i = 0; i < numsSize; i++){answer[*resRowIndex][i] = thisTurnArr[i];}(*resRowIndex)++;return;}for (int i = 0; i < numsSize; i++){if (!isUsed[i]){thisTurnArr[ansIndexNow] = nums[i];printf("thisturn[%d] = %d\n", ansIndexNow , nums[i]);isUsed[i] = true;dfs(nums, isUsed, answer, ansIndexNow + 1, numsSize, thisTurnArr, resRowIndex);isUsed[i] = false;}}return;
}int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{*returnSize = 1;for (int i = 1; i <= numsSize; i++){(*returnSize) *= i; // 计算排列数}int** res = (int**)calloc(*returnSize, sizeof(int*));*returnColumnSizes = (int*)calloc(*returnSize, sizeof(int));for (int i = 0; i < *returnSize; i++){(*returnColumnSizes)[i] = numsSize;}bool* isUsed = (bool*)calloc(numsSize, sizeof(bool));int* thisTurnArr = (int*)calloc(numsSize, sizeof(int));int resRowIndex = 0;dfs(nums, isUsed, res, 0, numsSize, thisTurnArr, &resRowIndex);free(isUsed);free(thisTurnArr);return res;
}

思路分析

这套代码用了*深度优先搜索(DFS)*方法。
代码的整体逻辑是通过递归的方式,生成所有可能的排列组合。每次递归将一个未使用的数字添加到当前排列中,直到排列长度等于原数组长度时,将该排列加入结果集中。

拆解分析

  1. dfs函数
void dfs(int* nums, bool* isUsed, int** answer, int ansIndexNow, int numsSize, int* thisTurnArr, int* resRowIndex)
{if (numsSize == ansIndexNow){answer[*resRowIndex] = (int*)calloc(numsSize, sizeof(int));for (int i = 0; i < numsSize; i++){answer[*resRowIndex][i] = thisTurnArr[i];}(*resRowIndex)++;return;}for (int i = 0; i < numsSize; i++){if (!isUsed[i]){thisTurnArr[ansIndexNow] = nums[i];printf("thisturn[%d] = %d\n", ansIndexNow , nums[i]);isUsed[i] = true;dfs(nums, isUsed, answer, ansIndexNow + 1, numsSize, thisTurnArr, resRowIndex);isUsed[i] = false;}}return;
}

dfs函数的解析:
该函数用于生成当前排列组合。通过递归,将每个未使用的数字添加到当前排列中,直到当前排列长度等于原数组长度,将该排列加入结果集中。

  1. permute函数
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{*returnSize = 1;for (int i = 1; i <= numsSize; i++){(*returnSize) *= i; // 计算排列数}int** res = (int**)calloc(*returnSize, sizeof(int*));*returnColumnSizes = (int*)calloc(*returnSize, sizeof(int));for (int i = 0; i < *returnSize; i++){(*returnColumnSizes)[i] = numsSize;}bool* isUsed = (bool*)calloc(numsSize, sizeof(bool));int* thisTurnArr = (int*)calloc(numsSize, sizeof(int));int resRowIndex = 0;dfs(nums, isUsed, res, 0, numsSize, thisTurnArr, &resRowIndex);free(isUsed);free(thisTurnArr);return res;
}

permute函数的解析:
该函数用于初始化和调用dfs函数。首先计算排列数目,分配内存,初始化标志数组和当前排列数组,最后调用dfs函数生成所有排列组合。

复杂度分析

  • 时间复杂度:O(n * n!),其中n是数组长度。每个排列的生成需要O(n)的时间,总共有n!个排列。
  • 空间复杂度:O(n * n!),需要存储所有的排列组合和递归调用栈。

结果

在这里插入1描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368440.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

护网蓝队面试

一、sql注入分类 **原理&#xff1a;**没有对用户输入项进行验证和处理直接拼接到查询语句中 查询语句中插⼊恶意SQL代码传递后台sql服务器分析执行 **从注入参数类型分&#xff1a;**数字型注入、字符型注入 **从注入效果分&#xff1a;**报错注入、布尔注入、延时注入、联…

day04-组织架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-树组件应用树形组件-用层级结构展示信息&#xff0c;可展开或折叠。 2.组织架构-树组件自定义结构3.组织架构-获取组织架构数据4.组织架构-递归转化树形…

02-部署LVS-DR群集

1.LVS-DR工作原理 LVS-DR模式&#xff0c;Director Server作为群集的访问入口&#xff0c;不作为网购使用&#xff0c;节点Director Server 与 Real Server 需要在同一个网络中&#xff0c;返回给客户端的数据不需要经过Director Server 为了响应对整个群集的访问&#xff0c;…

Docker镜像加速配置

由于当前运营商网络问题&#xff0c;可能会导致您拉取 Docker Hub 镜像变慢&#xff0c;索引可以配置阿里云镜像加速器。阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 每个人镜像地址都不一样&#xff0c;需要登陆阿里云自行查看&#xff0c;地址在上面&a…

llama-factory训练RLHF-PPO模型

理论上RLHF&#xff08;强化学习&#xff09;效果比sft好&#xff0c;也更难训练。ppo有采用阶段,步骤比较多,训练速度很慢. 记录下工作中使用llama-factory调试rlhf-ppo算法流程及参数配置,希望对大家有所帮助. llama-factory版本: 0.8.2 一 rlhf流程 ppo训练流程图如下, 会…

油猴Safari浏览器插件:Tampermonkey for Mac 下载

Tampermonkey 是一个强大的浏览器扩展&#xff0c;用于运行用户脚本&#xff0c;这些脚本可以自定义和增强网页的功能。它允许用户在网页上执行各种自动化任务&#xff0c;比如自动填写表单、移除广告、改变页面布局等。适用浏览器&#xff1a; Tampermonkey 适用于多数主流浏览…

Golang | Leetcode Golang题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; func rangeBitwiseAnd(m int, n int) int {for m < n {n & (n - 1)}return n }

二叉树与堆相关的时间复杂度问题

目录 满二叉树与完全二叉树高度h和树中节点个数N的关系 向上调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向下调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向上调整建堆&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a;…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句&#xff0c;从而获取、修改或删除数据库中的数据。 具体细节如下&#xff1a; 攻击向量&…

无人机森林火灾解决方案

森林火灾解决方案 森林火灾特点 森林火灾发生突然、蔓延迅速、难以控制&#xff0c;应对难度系 数很高&#xff0c;扑救工作十分困难 救援面临的挑战 • 林区交通不便&#xff0c; 山高坡陡&#xff0c; 沟壑纵横&#xff0c;难以及时侦查、 定位、扑灭 • 火灾发生的区域…

基于opencv的斜光测距及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目&#xff0c;东西不多&#xff0c;但是很有意思&#xff0c;值得拿出来学一学。项目里面需要比较精确的定位功能&#xff0c;将前人matlab代码移植到python上&#xff0c;并且做了一些优化&#xff0c;简化逻辑(毕竟我是专业的…

马工程刑法期末复习笔记重点2

马工程刑法期末复习笔记重点2

【JavaWeb程序设计】环境配置和Web工程的创建

目录 一、安装JDK、Tomcat&#xff0c;进行测试Tomcat能否正常启动。 二、修改Tomcat端口为8976&#xff0c;重新进行测试 三、使用集成开发环境Intelligent Idea&#xff0c;绑定JDK和Tomcat&#xff0c;建立站点&#xff0c;并测试 四、编写一个简单的html页面&#xff0…

微信小程序遮罩层显示

效果展示&#xff1a; wxml页面&#xff1a; <view classmodal-mask wx:if{{showModal}}><view class"modal-container"><view classmodal-content></view><view classmodal-footer bindtap"closeImage">//这个/images/ind…

SpringMVC的架构有什么优势?——控制器(一)

文章目录 控制器(Controller)1. 控制器(Controller)&#xff1a;2. 请求映射(Request Mapping)&#xff1a;3. 参数绑定(Request Parameters Binding)&#xff1a;4. 视图解析器(View Resolver)&#xff1a;5. 数据绑定(Data Binding)&#xff1a;6. 表单验证(Form Validation)…

Workerman在线客服系统源码,附搭建教程

源码介绍&#xff1a; Workerman在线客服系统源码。 workerman是一个高性能的PHP socket 服务器框架&#xff0c;workerman基于PHP多进程以及libevent事件轮询库&#xff0c;PHP开发者只要实现一两个接口&#xff0c;便可以开发出自己的网络应用&#xff0c;例如Rpc服务、聊天…

leetCode.98. 验证二叉搜索树

leetCode.98. 验证二叉搜索树 题目描述 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(n…

秋招Java后端开发冲刺——并发篇2(JMM与锁机制)

本文对Java的内存管理模型、volatile关键字和锁机制进行详细阐述&#xff0c;包括synchronized关键字、Lock接口及其实现类ReentrantLock、AQS等的实现原理和常见方法。 一、JMM&#xff08;Java内存模型&#xff09; 1. 介绍 JMM定义了共享内存中多线程程序读写操作的行为规…

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 1、定时器0工作在模式0框图 2、定时器0工作在模式0举例 1、Keil C51中有一些关键字&#xff0c;需要牢记&#xff1a; interrupt 0&#xff1a;指定当前函数为外部中断0&#xff1b; interrupt 1&#xff1a;指定当前函数为定时器0中断…

【C语言】union 关键字

在C语言中&#xff0c;union关键字用于定义联合体。联合体是一种特殊的数据结构&#xff0c;它允许不同的数据类型共享同一段内存。所有联合体成员共享同一个内存位置&#xff0c;因此联合体的大小取决于其最大成员的大小。 定义和使用联合体 基本定义 定义一个联合体类型时…