[回溯算法]leetcode40. 组合总和 II(c实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[回溯算法]leetcode40. 组合总和 II(c实现)相关的知识,希望对你有一定的参考价值。

题目

代码

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
 int *path;
 int pathTOP;
 int **ans;
 int  ansTOP;
 int *length;
 void backtracking(int*candidates,int candidatesSize,int target,int sum,int startindex)
 
     int i=0;
     if(sum>target)
     
         return ;
     
     //递归终止条件
     if(sum==target)
     
        int*temp=(int*)malloc(sizeof(int)*pathTOP);
        for(i=0;i<pathTOP;i++)
        
          temp[i]=path[i];
        
         ans[ansTOP]=temp;
         length[ansTOP++]=pathTOP;
         return ;
     
     for(i=startindex;i<candidatesSize;i++)
     
         if(i>startindex&&candidates[i-1]==candidates[i])
         //判断是否用于去重,若为树层则需去重
         
             continue;
         
         path[pathTOP++]=candidates[i];
         sum+=candidates[i];
         backtracking(candidates,candidatesSize,target,sum,i+1);
         //回溯
         sum-=candidates[i];
         pathTOP--;
     
 
 int cmp(const void*e1,const void*e2)
 
     return *((int*)e1)-*((int*)e2);
 
int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes)
      path=(int*)malloc(sizeof(int)*50);
      ans=(int**)malloc(sizeof(int*)*200);
      length=(int*)malloc(sizeof(int)*200);
      pathTOP=0;
      ansTOP=0;
      int sum=0;//用于记录取值的加和,与traget判断
      int startindex=0;//用于记录起始位置
      qsort(candidates,candidatesSize,sizeof(int),cmp);
      backtracking(candidates,candidatesSize,target,sum,startindex);
      *returnSize=ansTOP;
      //记录每个集合中的大小
      *returnColumnSizes=(int*)malloc(sizeof(int)*ansTOP);
      int i=0;
      for(i=0;i<ansTOP;i++)
      
          (*returnColumnSizes)[i]=length[i];
      
       return ans;


过程

1.为什么要有去重操作

2.分辨树层重复还是树层与树枝重复

3.递归展开图

以上是关于[回溯算法]leetcode40. 组合总和 II(c实现)的主要内容,如果未能解决你的问题,请参考以下文章

算法 ---- LeetCode回溯系列问题题解

算法 ---- LeetCode回溯系列问题题解

算法 ---- LeetCode回溯系列问题题解

leetcode 40. 组合总和 II---回溯篇3

递归与回溯7:LeetCode40. 组合总和 II(不可重复)

[leetcode 40. 组合总和 II] 不排序使用哈希表+dfs递归 vs 排序栈+回溯