C语言
void dfs ( int * nums, int numsSize, int * cs, int sum, int * * * ret, int * returnSize, int * * colSize, int curi) {
int i;
if ( sum < 0 ) {
return ;
}
if ( sum == 0 ) {
int tcs = 0 ;
int tail = 0 ;
int j;
int ci = 0 ;
for ( i = 0 ; i < numsSize; i++ ) {
tcs + = cs[ i] ;
}
( * returnSize) ++ ;
tail = ( * returnSize) - 1 ;
* ret = realloc ( * ret, ( * returnSize) * ( sizeof ( int * ) ) ) ;
* colSize = realloc ( * colSize, ( * returnSize) * sizeof ( int ) ) ;
( * ret) [ tail] = calloc ( tcs, sizeof ( int ) ) ;
( * colSize) [ tail] = tcs;
for ( i = 0 ; i < numsSize; i++ ) {
for ( j = 0 ; j < cs[ i] ; j++ ) {
( * ret) [ tail] [ ci] = nums[ i] ;
ci++ ;
}
}
return ;
}
for ( i = 0 ; i < numsSize; i++ ) {
if ( i < curi)
continue ;
cs[ i] ++ ;
dfs ( nums, numsSize, cs, sum - nums[ i] , ret, returnSize, colSize, i) ;
cs[ i] -- ;
}
return ;
}
int * * combinationSum ( int * nums, int numsSize, int target, int * returnSize, int * * returnColumnSizes) {
int * * ret = NULL ;
int * cs = NULL ;
* returnSize = 0 ;
ret = calloc ( 0 , sizeof ( int * ) ) ;
* returnColumnSizes = calloc ( 0 , sizeof ( int ) ) ;
cs = calloc ( numsSize, sizeof ( int ) ) ;
dfs ( nums, numsSize, cs, target, & ret, returnSize, returnColumnSizes, 0 ) ;
return ret;
}
注意点
回溯结束后记得把增加了的计数减1; 注意去掉重复项,如果每次都是全遍历,举个例子,如同用例1:会出现【2,2,3】【2,3,2】【3,2,2】会满足递归条件,所以本人在题解中加入了curi来控制重复情况;
结果
题目