leetcode 39. 组合总和 C语言

荒凉一梦 提交于 2020-02-08 02:25:04

给定一个无重复元素的数组 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;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!