/*
* 算法思想:
* 回溯算法,套用回溯框架,很容易得出答案,详见代码注释。
*
*
*/
void rec(int *arr, int len, int index, int *stack, int *stack_index,
int target, int **ret, int *ret_index, int *ret_size){
if(index >= len || target < 0 ) return;
/* 符合条件,添加到答案中 */
if(target == 0){
ret[(*ret_index)] = (int *)malloc(sizeof(int) * (*stack_index));
ret_size[(*ret_index)] = *stack_index;
memcpy(ret[(*ret_index)], stack, (*stack_index)*sizeof(int));
(*ret_index)++;
return;
}
/* 回溯循环,注意从index开始,因为可以重复使用相同的元素 */
for(; index<len; index++){
target -= arr[index];
stack[(*stack_index)++] = arr[index];
rec(arr, len, index, stack, stack_index, target, ret, ret_index, ret_size);
(*stack_index)--;
target += arr[index];
}
}
#define LEN 0xffff
int** combinationSum(int* arr, int len, int target, int* returnSize, int** returnColumnSizes){
int *stack = (int *)malloc(sizeof(int) * LEN);
int stack_index = 0;
int **ret = (int **)malloc(sizeof(int *) * LEN);
int ret_index = 0;
int *ret_size = (int *)malloc(sizeof(int) * LEN);
*returnColumnSizes = ret_size;
rec(arr, len, 0, stack, &stack_index, target, ret, &ret_index, ret_size);
//printf("ret_index = %d \n", ret_index);
*returnSize = ret_index;
free(stack);
return ret;
}
LeetCode-39-组合总和-C语言
猜你喜欢
转载自blog.csdn.net/weixin_36094222/article/details/90142579
今日推荐
周排行