LeetCode 46. 全排列 Permutations (C语言)

C版的迷你程序——排列permutation 这是数学的重要概念之一。有限集的子集按某种条件的序列化排成列、不许重复等。从n个不同元素中每次取出m(1≤m≤n)个不同元素,排成一列,称为从n个元素中取出m个元素的无重复排列或直线排列,简称排列(permutation)。从n个不同元素中取出m个不同元素的所有不同排列的个数称为排列种数或称排列数,记为 排列的数学描述 当且仅当两个排列的元素完全相同,且元素的排列顺序也相同,则两个排列相同。例如,abc与abd的元素不完全相同,它们是不同的排列;又如abc与acb,虽然... 阅读详情

题目描述:

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

题目解答:

方法1:回溯

使用循环+递归,并利用标记数组,来标记每个数字是否使用过,使用过则跳过,没使用过则可以使用,并且要记得取消标记。
运行时间4ms,代码如下。

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
void dfs(int*** result, int* size, int* before, int bef, int n, int* nums, bool* flag) {
    if(bef == n) {
        (*size)++;
        result[0] = (int**)realloc(result[0], *size * sizeof(int*));
        result[0][*size - 1] = (int*)malloc(n * sizeof(int));
        memcpy(result[0][*size - 1], before, n * sizeof(int));
        return;
    }
    int i = 0;
    for(i = 0; i < n; i++) {
        if(!flag[i]) {
            flag[i] = true;
            before[bef] = nums[i];
            dfs(result, size, before, bef + 1, n, nums, flag);
            flag[i] = false;
        }
    }
}
int** permute(int* nums, int numsSize, int* returnSize) {
    int** result = NULL;
    int* before = (int*)malloc(numsSize * sizeof(int));
    bool* flag = (bool*)calloc(numsSize, sizeof(bool));
    dfs(&result, returnSize, before, 0, numsSize, nums, flag);
    free(before);
    free(flag);
    return result;
}

或者使用交换法,将start及其之后的依次与start交换,进行递归,注意要交换回去。
运行时间4ms,代码如下。

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
void dfs(int*** result, int* size, int* before, int start, int n) {
    if(start == n) {
        (*size)++;
        result[0] = (int**)realloc(result[0], *size * sizeof(int*));
        result[0][*size - 1] = (int*)malloc(n * sizeof(int));
        memcpy(result[0][*size - 1], before, n * sizeof(int));
    }
    int i = 0, temp = 0;
    for(i = start; i < n; i++) {
        temp = before[i];
        before[i] = before[start];
        before[start] = temp;
        dfs(result, size, before, start + 1, n);
        before[start] = before[i];
        before[i] = temp;
        
    }
}
int** permute(int* nums, int numsSize, int* returnSize) {
    int** result = NULL;
    int* before = (int*)malloc(numsSize * sizeof(int));
    bool* flag = (bool*)calloc(numsSize, sizeof(bool));
    memcpy(before, nums, numsSize * sizeof(int));
    dfs(&result, returnSize, before, 0, numsSize);
    free(before);
    return result;
}
方法2:迭代法

有点类似于动态规划,假设我们现在已经存储好前n - 1个数字的所有排列情况,则我们任取一种排列,第n个数字插入其中,则有n个位置可以插入,所以对每个排列情况都进行这样的插入操作即可。
运行时间4ms,代码如下。

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int** permute(int* nums, int numsSize, int* returnSize) { 
    int i = numsSize, sum = 1;
    int j = 0, k = 0, last = 0;
    while(i) {
        sum *= i;
        i--;
    }
    int* temp = (int*)malloc(numsSize * sizeof(int));
    int** result =  (int**)malloc(sum * sizeof(int*));
    for(i = 0; i < sum; i++)
        result[i] = (int*)malloc(numsSize * sizeof(int));
    result[0][0] = nums[0];
    sum = 1;
    for(i = 1; i < numsSize; i++) {
        last = sum;
        for(j = 0; j < last; j++) {
            result[j][i] = nums[i];
        }
        for(j = 0; j < last; j++) {
            memcpy(temp, result[j], i * sizeof(int));
            for(k = i - 1; k >= 0; k--) {
                temp[k + 1] = temp[k];
                temp[k] = nums[i];
                memcpy(result[sum++], temp, (i + 1) * sizeof(int));
            }
        }
        
    }
    free(temp);
    *returnSize = sum;
    return result;
}
C++ permutation排列算法详解(深入了解,一文学会) 排列就是一次对对象序列或值序列的重新排列。例如,“ABC”中字符可能的排列是:三个不同的字符有 6 种排列,这个数字是从 3*2*1 得到的。一般来说,n 个不同的字 符有 n!种排列,n!是 nx(n_1)x(n-2)...x2x1。很容易明白为什么要这样算。有 n 个对象 时,在序列的第一个位置就有 n 种可能的选择。对于第一个对象的每一种选择,序列的第 二个位置还剩下 n-1 种选择,因此前两个有 nx((n-1) 种可能选择。 阅读详情

相关推荐

全排列问题算法及实现(Permutation)

前言 做项目遇到数据采集系统中ADC拼合问题,如果顺序不对,波形就是错误的(题外话),为了找到正确的顺序,涉及到排列问题。 什么是排列组合 定义 一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement)。特别地,当m=n时,这个排列被称作全排列(Permutation)。  Ex:考虑三个数字1,2,3,这个序...

Dufre 4622

Permutations

Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. class Solutio

IIcyZhao's Road 947

嵌入式开发中Tab与空格混用的危害与统一规范实践

在软件工程中,代码格式一致性是保障可读性与团队协作效率的基础。从原理上看,制表符(Tab)与空格(Space)在存储与显示机制上存在本质差异:Tab是控制字符,其显示宽度取决于编辑器设置;空格则是固定宽度的字符。这种差异导致混用时会引发代码对齐错乱、版本控制冲突及跨平台兼容性问题,严重影响工程的可维护性。尤其在嵌入式开发领域,资源受限环境与高可靠性要求使得统一的编码规范更为关键。通过配置编辑器、集成clang-format等自动化工具,可以强制实现缩进风格的一致性,从而提升代码质量与团队协作效率。本文聚焦于

weixin_42545636的博客 276

next permutation c语言,C语言版 next_permutation(排列)

列出数组元素的所有排列是一项比较常用的功能。C++ 的 STL 库中自带了 next_permutation (很多其他高级语言也自带了类似功能),不过在纯 C 环境中就不得不自己实现了。算法描述如下:对于排列,数组的初始状态是元素以升序排列;终止状态时元素以降序排列。比如 1 2 3 三个元素进行排列,最终状态会变成 3 2 1。这一性质也是递归的:即 1 2 3 这个序列,除去第一个元素 1,...

weixin_33342041的博客 1408

Cryptomatte For Nuke的安装

进入官网https://github.com/Psyop/Cryptomatte,下载文件代码。 将Cryptomatte/nuke里的文件内容复制粘贴到 .nuke文件夹内。 在我们复制粘贴的内容中可以看到两个文件。 同时,我们进入nuke的下载目录,打开plugins文件夹,看到和插件中一样python文件——init.py和menu.py。 我们将Cryptomatte里的init.py和menu.py里的python代码复制粘贴到Nuke/plugins下的init...

qq_41627587的博客 9061

ESP32与INMP441麦克风模块实现音频传输

ESP32是一款低成本、低功耗的物联网开发板,支持Wi-Fi和蓝牙双模通信,内置双核处理器,适合音频处理和实时数据传输。INMP441是一款高性能数字麦克风模块,支持I2S接口,可提供高精度音频数据采集(24-bit分辨率,64-100 dB SNR)。

走向CTO的路上... 2040

LeetCode:46. Permutations 全排列(C语言)

题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations 著作权归领扣网络所有。商业转载请联系官方授权,非商...

C/C++攻城狮 1773

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 868

LeetCode—46.全排列(Permutations)——分析及代码(C++)

LeetCode—46.全排列[Permutations]——分析及代码[C++]一、题目二、分析及代码1. 回溯法(1)思路(2)代码(3)结果三、其他 一、题目 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] ...

江南土豆的博客 494

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

【教程4>第5章>第28节】基于帧同步+相位同步+位同步的QPSK调制解调通信系统整体性能分析

综上所述:1.SNR<10db时,整体性能下降,当SNR=0db时,系统无法正常工作。2.gardner环性能达到2.5e-5时偏可以正常工作,增加之后无法正常工作。3.当相位偏差大于pi/4的时候,对最后的性能会有一定影响。

FPGA/MATLAB学习教程/源码/项目合作开发 556

LeetCode(46):全排列 Permutations(Java)

2019.6.16 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) 全排列问题的标准交换递归解法。详细思路可以参考之前刷过的剑指Offer题: #数据结构与算法学习笔记#剑指Offer26:字符串的排列升级版 + 去重全排列问题3种解法 + 字典序算法 + 测试用例(Java、C/C++) 传送门:全排列 Given a collection of distinct i...

NJU_ChopinXBP的博客 416

YOLO11实战优化:长尾分布解决 | 引入Seesaw Loss配合YOLO11分类头,完美应对类别极其不平衡的现实业务场景

摘要: YOLO11在工业缺陷检测等长尾分布场景中面临尾部类别检测失效的问题,根源在于头部类别样本的负样本梯度压制了尾部类别的学习。传统方法如重采样、Focal Loss等效果有限。Seesaw Loss通过动态调整缓解因子和补偿因子,平衡类别间的梯度分布,结合YOLO11的解耦分类头、Anchor-Free设计和C2PSA/C3K2模块,显著提升尾部类别识别能力。文章详细解析了Seesaw Loss的数学原理,并提供了可直接集成到YOLO11的PyTorch实现代码,为长尾分布下的目标检测提供了实用解决方

2601_95807009的博客 252

LeetCode46——Permutations

LeetCode46——Permutations 求全排列,这题偷了个懒,借用了之前求下一个全排列的代码。 之前看到过递归的方法,包含重复元素,和不包含重复元素的方法,有时间会补上。 代码: class Solution { private: void Swap(int &a, int &b) { int temp = a; a = b; b = temp; } boo

上善若水 1716

图机器学习(7)——图神经网络 (Graph Neural Network, GNN)

图神经网络 (Graph Neural Network, GNN) 是一类专门处理图结构数据的深度学习方法。这类方法也被称为几何深度学习 (geometric deep learning),在社交网络分析、计算机图形学等众多领域正受到日益广泛的关注。在本节中,我们介绍了 GNN 的核心原理,将卷积等经典深度学习范式拓展至非欧几里得图空间,实现了局部结构与全局特征的层次化提取。

盼小辉丶的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

46. 全排列(Permutations)C语言高质量题解

摘要:本文介绍了一个生成数组全排列的回溯算法解决方案。给定不含重复数字的数组nums,通过回溯法生成所有可能的排列组合。算法使用路径数组path记录当前排列,used数组标记已使用数字,当路径长度等于数组长度时保存结果。C语言实现中动态分配内存存储结果,时间复杂度为O(n×n!),空间复杂度为O(n!)。文章包含完整代码实现、复杂度分析和总结,并指出该算法可扩展处理含重复元素的数组。

2302_80441878的博客 199

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【LeetCode】46. Permutations 解题报告(Python & C++)

【LeetCode】46. Permutations 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/permutations/description/ 题目描述: Given a collection of distinct numbers, return all possible permutations. ...

负雪明烛 8441

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Leetcode46: 全排列

Leetcode46: Permutations Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路:遍历nums中的...

Flying_sfeng的博客 365

LeetCode-46. Permutations [C++][Java]

Given an arraynumsof distinct integers, returnall the possible permutations. You can return the answer inany order.

贫道绝缘子的博客 340

LeetCode 46. 全排列 Permutations

8-3 排列问题 Permutations 题目: LeetCode 46. 全排列 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] import java.util.List; import java.util.ArrayList; im...

KAIKAI_ING的博客 349

leetcode 47. Permutations II-排列|回溯算法

原题链接:47. Permutations II 【思路1-Java】 这题是leetcode 46. Permutations-全排列|回溯|递归|非递归思路1延伸,每次交换 nums 中的两个元素,新生成一种新的组合,将该组合放入中间集,再放入结果集中,对于重复元素的处理,这里采用 set 集合进行去重,思路虽然好理解,可是也费了不少空间: public class Solution {

hdtopku 4615

Leetcode 46. Permutations (Medium) (cpp)

Leetcode 46. Permutations (Medium) (cpp)

还是需要多学习!闷声大发财,这是坠吼的! 488

46. Permutations(全排列)两种解法(C++ & 注释)

46. Permutations(全排列)1. 题目描述2. 乘法(Multiplication)2.1 解题思路2.2 实例代码3. 乘法(Multiplication)3.1 解题思路3.2 实例代码4. 乘法(Multiplication)4.1 解题思路4.2 实例代码5. 参考资料 1. 题目描述 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2],

主要研究图形学相关领域 1287

leetcode力扣46. 全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] python内置的一个函数 class Solution(object): def permute(self, nums): """ ...

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 477

力扣-46题 全排列(C++)- 回溯

题目链接:https://leetcode-cn.com/problems/permutations/ 题目如下: class Solution { public: vector<int> path; vector<vector<int>> result; vector<vector<int>> permute(vector<int>& nums) { result.clear();

qq_40467670的博客 308

LeetCode46 Permutations

详细见:leetcode.com/problems/permutations Java Solution: github package leetcode; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class P046_Permutations {

zxwtry的博客 255
上一篇: LeetCode 43. 字符串相乘 Multiply Strings(C语言)
下一篇: LeetCode 47. 全排列 II Permutations II(C语言)
hang-7788
博客等级 码龄10年 47粉丝 71原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值