给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
/**
* 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 cmpfunc(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
void backTracking(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes, int index, int pos, int *temp, int **returnCombinationSum)
{
int i = 0;
if (target == 0) {
returnCombinationSum[(*returnSize)] = (int*)malloc(sizeof(int) * index);
(*returnColumnSizes)[(*returnSize)] = index;
for (i = 0; i < index; i++) {
returnCombinationSum[(*returnSize)][i] = temp[i];
}
(*returnSize)++;
return;
}
for (; pos < candidatesSize; pos++) {
if (candidates[pos] > target) {
break;
}
temp[index] = candidates[pos];
backTracking(candidates, candidatesSize, target - candidates[pos], returnSize, returnColumnSizes, index + 1, pos, temp, returnCombinationSum);
}
}
int** combinationSum(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){
qsort(candidates, candidatesSize, sizeof(int), cmpfunc);
int **returnCombinationSum = (int**)malloc(sizeof(int*) * 256);
*returnColumnSizes = (int*)malloc(sizeof(int) * 256);
int *temp = (int*)malloc(sizeof(int) * 256);
*returnSize = 0;
backTracking(candidates, candidatesSize, target, returnSize, returnColumnSizes, 0, 0, temp, returnCombinationSum);
free(temp);
return returnCombinationSum;
}
来源:CSDN
作者:段刘昌
链接:https://blog.csdn.net/DuanLiuchang/article/details/104216283