Leetcode第46题全排列|C语言

void dfs(int top,int numsSize,int** result,int*returnSize,int*temp,int** returnColumnSizes,int startIndex,int* nums){
    if(top==numsSize){//本轮收集的数组内元素数量达标,则收割结果
        result[*returnSize]=malloc(sizeof(int)*top);
        for(int i=0;i<top;i++){
            result[*returnSize][i]=temp[i];
        }
        (*returnColumnSizes)[(*returnSize)++]=top;
        return;
    }
    int symbol=0;//标志,用来判断temp数组之前的元素有没有跟nums[i]重复
    for(int i=startIndex;i<numsSize;i++){
        for(int j=0;j<top;j++){//遍历判断有无重复
            if(temp[j]==nums[i]){
                symbol=1;
                break;
            }
        }
        if(symbol==0){
            temp[top]=nums[i];
            dfs(top+1,numsSize,result,returnSize,temp,returnColumnSizes,0,nums);
            //因为这里的startindex从0开始,所以也可以不设这个参数,每轮直接从0开始
            //因为从0开始,所以可能出现 111,112 这种元素重复收集的情况,因此前面需要遍历判断
        }else{//重复的话,则重置标志位,跳过此次循环
            symbol=0;
            continue;
        }
                
    }    
}

int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    int** result=malloc(sizeof(int)*2000);
    (*returnSize)=0;
    (*returnColumnSizes)=malloc(sizeof(int)*2000);
    int* temp=malloc(sizeof(int)*21);
    dfs(0,numsSize,result,returnSize,temp,returnColumnSizes,0,nums);
    return result;
}

执行情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值