LeetCode-46 全排列

LeetCode-46 全排列

原题目

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

示例:

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

题目大意

如题。。

题目分析

这道题目可以用标准的深搜回溯来做。

思路

1.标准深搜回溯
2.交换数值

代码

1.第一种方法。

void backtrace(int *nums,int numsSize,int *returnSize,int **returnColumnSizes,int **arr,int *example,int *flag,int depth)    {
    if(depth == numsSize)   {
        arr[(*returnSize)] = (int *)malloc(sizeof(int*) * depth);
        for(int i = 0; i < numsSize; i++)  {
             arr[*returnSize][i] = example[i];
        }
        (*returnColumnSizes)[*returnSize] = numsSize;
        (*returnSize)++;
        return;
    }   

    for(int i = 0; i < numsSize; i++)   {
        if(flag[i])continue;
        flag[i] = 1;
        example[depth] = nums[i];
        backtrace(nums,numsSize,returnSize,returnColumnSizes,arr,example,flag,depth+1);
         flag[i] = 0;
    }

}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    if(nums == NULL)    {
        return NULL;
    }
    int **arr = (int **)malloc(sizeof(int*)*1000);
    if(arr == NULL) {
        return NULL;
    }
    memset(arr,0,sizeof(int *) * 1000);
    *returnColumnSizes = (int *)malloc(sizeof(int) * 1000);
    if(returnColumnSizes == NULL)   {
        return NULL;
    }
    memset(*returnColumnSizes,0,sizeof(int) * 1000);
    *returnSize = 0;
    int *example = (int *)malloc(sizeof(int) * numsSize);
    if(example == NULL) {
        return NULL;
    }
    memset(example,0,sizeof(int) * numsSize);
    int *flag = (int*)calloc(sizeof(int), numsSize);
    backtrace(nums,numsSize,returnSize,returnColumnSizes,arr,example,flag,0);
    free(flag);
    free(example);

    return arr;

}

2.第二种方法

#define MAX_SIZE 5000

static void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

static void dfs(int* nums, int numsSize, int* returnSize, int** returnColumnSizes,
                int** ppRes)
{
    static int slow = 0;
    int fast = 0;

    if (slow == numsSize)
    {
        ppRes[*returnSize] = (int*)malloc(numsSize * sizeof(int));
        memcpy(ppRes[*returnSize], nums, numsSize * sizeof(int));
        (*returnColumnSizes)[*returnSize] = numsSize;
        (*returnSize)++;
    }
    else 
    {
        for (fast = slow; fast <= numsSize - 1; fast++)
        {
            swap(nums + slow, nums + fast);
            slow++;

            dfs(nums, numsSize, returnSize, returnColumnSizes, ppRes);

            slow--; // 回溯
            swap(nums + slow, nums + fast);
        }
    }

}

int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    int** ppRes = (int**)malloc(MAX_SIZE * sizeof(int*));
    *returnSize = 0;
    *returnColumnSizes = (int*)malloc(MAX_SIZE * sizeof(int));

    dfs(nums, numsSize, returnSize, returnColumnSizes, ppRes);

    return ppRes;
}

作者:hua-jia-wang-tie-nan(还没有自己写)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值