• 78.子集


    求所有的子集,一下子就想到回溯,回溯有两个模板,一个是组合combition,一个是全排列oermutation。

    /*
    组合combination:
    n代表几个数,或者说树的深度。
    path代表回溯过程中多叉树节点的值
    depth代表path的下标
    start开始位置。在组合中dfs是i+1,如果允许重复则为i。
    */
    void dfs(int *nums,int numsSize,int *returnSize,int** returnColumnSizes,int **result,int *path,int depth,int start,int n)
    {
        if(depth==n)
        {
            result[*returnSize]=(int *)malloc(sizeof(int)*depth);
            for(int i=0;i<depth;i++){
                printf("%d ",path[i]);
                result[*returnSize][i]=path[i];
            }
            printf("
    ");
            *returnSize++;
            return;
        }
    
        for(int i=start;i<numsSize;i++)
        {
            path[depth]=nums[i];
            dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,depth+1,i+1,n);
        }
    
    }
    /*
    全排列permutation:
    n代表几个数,或者说树的深度。
    path代表回溯过程中多叉树节点的值
    depth代表path的下标
    used用来记录该数是否使用过,初始化为全1,用calloc初始化。
    */
    void dfs(int *nums,int numsSize,int *returnSize,int** returnColumnSizes,int **result,int *path,int depth,int n)
    {
        if(depth==n)
        {
            result[*returnSize]=(int *)malloc(sizeof(int)*depth);
            for(int i=0;i<depth;i++){
                printf("%d ",path[i]);
                result[*returnSize][i]=path[i];
            }
            printf("
    ");
            *returnSize++;
            return;
        }
    
        for(int i=0;i<numsSize;i++)
        {
            if(used[i])
                continue;
            used[i]=1;
            path[depth]=num[i];
            dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,depth+1,n);
            used[i]=0;
        }
    
    }
    

     

    /*
    
    */
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #include<string.h>
    #include<iostream>
    void dfs(int *nums,int numsSize,int *returnSize,int** returnColumnSizes,int **result,int *path,int depth,int start,int n)
    {
        if(depth==n)
        {
    
            if(depth==0){
                result[*returnSize++]=NULL;
                //returnColumnSizes[0][*returnSize]=0;
                return;
            }
            result[*returnSize]=(int *)malloc(sizeof(int)*depth);
            for(int i=0;i<depth;i++)
                if(path[i]){
                    printf("%d ",path[i]);
                    result[*returnSize][i]=path[i];
                }
            //returnColumnSizes[0][*returnSize]=depth;
            printf("
    ");
            *returnSize++;
            return;
        }
    
        for(int i=start;i<numsSize;i++)
        {
            path[depth]=nums[i];
            dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,depth+1,i+1,n);
        }
    
    }
    
    int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
        int len=pow(2,numsSize),i;
        int **result=(int **)malloc(sizeof(int *)*len);
        int *path=(int *)malloc(sizeof(int)*numsSize);
        *returnSize=0;
        //returnColumnSizes[0]=(int*)malloc(sizeof(int)*100);
        for(i=0;i<=numsSize;i++){
            dfs(nums,numsSize,returnSize,returnColumnSizes,result,path,0,0,i);
        }
        return result;
    }
    
    int main()
    {
        int* nums, numsSize=3,a[3]={1,2,3},*returnSize,** returnColumnSizes,i,j;
        nums=(int*)malloc(sizeof(int)*3);
        returnSize=(int*)malloc(sizeof(int));
        *returnSize=3;
        returnColumnSizes=(int**)malloc(sizeof(int*)*100);
        nums=a;
    
        int **rs=subsets(nums,numsSize,returnSize,returnColumnSizes);
        //printf("%d
    ",rs[0][0]);
        return 0;
    }
  • 相关阅读:
    android手机上的app输入法遮挡输入框问题
    简单的百度地图使用
    简单的加入购物车动画效果,需引入外部js文件
    vue项目中axios跨域设置
    一次讲清promise
    js中宏任务,微任务,异步,同步,执行的顺序
    vantUI <van-uploader> 上传图片,如何获取图片的尺寸
    Vue双向绑定原理 从vue2的Object.defineProperty到vue3的proxy
    微信浏览器h5页面开发遇到问题
    Web前端优化最佳实践及工具集锦
  • 原文地址:https://www.cnblogs.com/zhaohuan1996/p/12814799.html
Copyright © 2020-2023  润新知