leetcode 39. Combination Sum
一、问题描述
给定一组数(数字没有重复)和一个目标值,找到数字中和为目标值的所有唯一组合。一个数字可以重复选择多次。
【注意】
- 所有数字(包括目标)都是正整数。
- 结果集不能包含重复的组合。
例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]
]
二、问题分析
由于要输出所有解集具体组合而不是解集个数,因此采用dfs的方法,边递归边记录结果
三、算法实现
/********************************************************* Author:tmw date:2018-5-14 *********************************************************/ #include <stdio.h> #include <stdlib.h> /** *final_r_perLen :存储每一组最终结果的长度 **final_r :存储所有结果的数组 start : 当前递归起始位置 **/ #define MAX_SIZE 200 int result[MAX_SIZE] = {0}; /**存储中间结果的数组**/ int j=0; /**结果数组下标**/ int count = 0; /**记录所有可能的组合个数**/ void sum_dfs( int* array, int array_len, int sum, int start, int** final_r, int* final_r_perLen ) { /**终止条件**/ if( sum == 0 ) { int i; for( i=0; i<j; i++ ) final_r[count][i] = result[i]; final_r_perLen[count] = j; count++; return; } int k; for( k=start; k<array_len; k++ ) { /**收敛条件---剪枝**/ if( array[k]>sum ) return; /**将当前元素加入中间结果数组**/ result[j++] = array[k]; sum_dfs(array,array_len,sum-array[k],k,final_r,final_r_perLen); j--; /**j回退到递归之前的状态**/ } } /**快排**/ #define swap( x,y,t ) (t=x,x=y,y=t) int fast_sort_one( int* array, int low, int high ) { int target = array[low]; int temp; while( low < high ) { if( low<high && array[high]>=target ) high--; swap(array[low],array[high],temp); if( low<high && array[low]<=target ) low++; swap(array[low],array[high],temp); } return low; } void fast_sort_all( int* array, int low, int high ) { if( low<high ) { int mid_index = fast_sort_one(array,low,high); fast_sort_all(array,low,mid_index-1); fast_sort_all(array,mid_index+1,high); } } int** combinationSum(int* candidates, int candidatesSize, int target, int** columnSizes, int* returnSize) { printf("%d\n",candidatesSize); fast_sort_all(candidates,0,candidatesSize-1); int i; int* final_r_perLen = (int*)malloc(MAX_SIZE*sizeof(int)); int** final_r = (int**)malloc(MAX_SIZE*sizeof(int*)); for( i=0; i<MAX_SIZE; i++ ) final_r[i] = (int*)malloc(MAX_SIZE*sizeof(int)); count = 0; /**全局变量count清零**/ sum_dfs(candidates,candidatesSize,target,0,final_r,final_r_perLen); *columnSizes = (int*)malloc(count*sizeof(int)); for(i=0; i<count; i++) (*columnSizes)[i] = final_r_perLen[i]; *returnSize = count; return final_r; }
四、执行结果
leetcode accept
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~