[回溯算法]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实现)的主要内容,如果未能解决你的问题,请参考以下文章