216.组合总和III
/**
* 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* path;
int path_index;
int** res;
int res_index;
void backtracking(int targetsum,int sum,int k,int start_index){
if(sum>targetsum) return ;//剪枝
if(path_index==k){
if(sum==targetsum){
int* temp=(int*)calloc(k,sizeof(int));
for(int i=0;i<k;i++){
temp[i]=path[i];
}
res[res_index++]=temp;
}
return ;//终止条件位置记得return
}
for(int i=start_index;i<=9-(k-path_index)+1;i++){//有等于号;9为start_index最大取值
path[path_index++]=i;//是i不是start_index;写成start_index会重复打印某个组合
sum+=i;//是i不是start_index
backtracking(targetsum,sum,k,i+1);//是i不是start_index
sum-=i;//是i不是start_index
path_index--;
}
}
int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes) {
path=(int*)calloc(k,sizeof(int));
path_index=0;
res=(int**)calloc(1000000,sizeof(int*));
res_index=0;
backtracking(n,0,k,1);//1为start_index最小取值
(*returnColumnSizes)=(int*)calloc(res_index,sizeof(int));
(*returnSize)=res_index;
for(int i=0;i<res_index;i++){
(*returnColumnSizes)[i]=k;
}
return res;
}
17.电话号码的字母组合
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char* path;
int pathTop;
char** result;
int resultTop;
char* letterMap[10] = {"", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz", //9
};
void backtracking(char* digits,int index){
if(index==strlen(digits)){
char* temp=(char*)calloc(strlen(digits)+1,sizeof(char));
for(int i=0;i<strlen(digits);i++){
temp[i]=path[i];
}
result[resultTop++]=temp;
return;
}
int digit=digits[index]-'0';
char* letter=letterMap[digit];
for(int i=0;i<strlen(letter);i++){
path[pathTop++]=letter[i];
backtracking(digits,index+1);
pathTop--;
}
}
char** letterCombinations(char* digits, int* returnSize) {
path=(char*)calloc(strlen(digits)+1,sizeof(char));
pathTop=0;
result=(char**)calloc(10000,sizeof(char*));
resultTop=0;
(*returnSize)=0;
if(strlen(digits)==0) return NULL;
backtracking(digits,0);
(*returnSize)=resultTop;
return result;
}