diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 8cea3b9e..97987e6d 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -346,6 +346,60 @@ var combinationSum = function(candidates, target) { }; ``` +C: +```c +int* path; +int pathTop; +int** ans; +int ansTop; +//记录每一个和等于target的path数组长度 +int* length; + +void backTracking(int target, int index, int* candidates, int candidatesSize, int sum) { + //若sum>=target就应该终止遍历 + if(sum >= target) { + //若sum等于target,将当前的组合放入ans数组中 + if(sum == target) { + int* tempPath = (int*)malloc(sizeof(int) * pathTop); + int j; + for(j = 0; j < pathTop; j++) { + tempPath[j] = path[j]; + } + ans[ansTop] = tempPath; + length[ansTop++] = pathTop; + } + return ; + } + + int i; + for(i = index; i < candidatesSize; i++) { + //将当前数字大小加入sum + sum+=candidates[i]; + path[pathTop++] = candidates[i]; + backTracking(target, i, candidates, candidatesSize, sum); + sum-=candidates[i]; + pathTop--; + } +} + +int** combinationSum(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); + ansTop = pathTop = 0; + backTracking(target, 0, candidates, candidatesSize, 0); + + //设置返回的数组大小 + *returnSize = ansTop; + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int i; + for(i = 0; i < ansTop; i++) { + (*returnColumnSizes)[i] = length[i]; + } + return ans; +} +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)