题目:
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
1.只使用数字1到9
2.每个数字 最多使用一次
3.返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
代码:
void dfs(int left,int right,int k,int n,int **ans,int *returnSize,int *temp,int *temp_index){
//left和1right为左右指针,即数字的范围1-9,n和k为题目给定的参数
//ans为最终要返回的结果,是一个指针数组,returnSIze为指针数组元素个数
//temp为当前的数组,temp_index为当前数组的下标
//先写退出逻辑
if(*temp_index>k)
return;//本轮数组大小大于k,则直接退出
else if((*temp_index)==k){//当前数组大小等于k
int sum=0;
for(int i=0;i<k;i++){//求当前数组的和
sum+=temp[i];
}
if(sum==n){//若数组的和等于n,则创建一个数组,将其放入最终结果的指针数组中
int *tmp=malloc(sizeof(int)*k);
for(int i=0;i<k;i++)
tmp[i]=temp[i];
ans[(*returnSize)++]=tmp;
}
return;
}
else if(left>right)//左指针大于右指针,返回
return;
temp[(*temp_index)++]=left;
dfs(left+1,right,k,n,ans,returnSize,temp,temp_index);
(*temp_index)--;
dfs(left+1,right,k,n,ans,returnSize,temp,temp_index);
}
int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){
int **ans=malloc(sizeof(int*)*1000);//最终保存每轮结果的指针数组
int *temp=malloc(sizeof(int)*k);//每轮用于保存数字的数组
int temp_index=0;
(*returnSize)=0;
dfs(1,9,k,n,ans,returnSize,temp,&temp_index);
(*returnColumnSizes)=malloc(sizeof(int)*(*returnSize));//指针数组内每个指针指向数组的大小
for(int i=0;i<(*returnSize);i++)
(*returnColumnSizes)[i]=k;
return ans;
}