/**
* 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().
*/voidbacktrack(int k,int n,int*returnSize,int**array,int idx,int*tmp,int start){if(idx == k){if(n ==0){for(int i =0; i < k; i++){
array[*returnSize][i]= tmp[i];}(*returnSize)++;}return;}for(int i = start; i <=9; i++){
tmp[idx++]= i;backtrack(k, n-i, returnSize, array, idx, tmp, i+1);
idx--;}}int**combinationSum3(int k,int n,int* returnSize,int** returnColumnSizes){int**array =(int**)malloc(sizeof(int*)*10000);for(int i =0; i <10000; i++){
array[i]=(int*)malloc(sizeof(int)* k);memset(array[i],0,sizeof(int)* k);}int*tmp =(int*)malloc(sizeof(int)* k);memset(tmp,0,sizeof(int)* k);*returnSize =0;backtrack(k, n, returnSize, array,0, tmp,1);*returnColumnSizes =(int*)malloc(sizeof(int)**returnSize);for(int i =0; i <*returnSize; i++){(*returnColumnSizes)[i]= k;}return array;}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/char map[][5]={[0]="",[1]="",[2]="abc",[3]="def",[4]="ghi",[5]="jkl",[6]="mno",[7]="pqrs",[8]="tuv",[9]="wxyz",};voidbacktrack(char*digits,int*returnSize,char**ans,int idx,char*tmp){if(idx ==strlen(digits)){for(int i =0; i < idx; i++){
ans[*returnSize][i]= tmp[i];}
ans[*returnSize][idx]=0;(*returnSize)++;return;}int n = digits[idx]-'0';for(int i =0; i <strlen(map[n]); i++){
tmp[idx]= map[n][i];backtrack(digits, returnSize, ans, idx+1, tmp);}}char**letterCombinations(char* digits,int* returnSize){char**ans =(char**)malloc(sizeof(char*)*1000);int n =strlen(digits);*returnSize =0;if(n ==0)returnNULL;char*tmp =(char*)malloc(sizeof(char)* n+1);memset(tmp,0,sizeof(char)* n+1);for(int i =0; i <1000; i++){
ans[i]=(int*)malloc(sizeof(char)* n+1);memset(ans[i],0,sizeof(char)* n+1);}backtrack(digits, returnSize, ans,0, tmp);return ans;}