目录
216. 组合总和 III
题目描述:
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
这道题目和昨天77.组合一样的。
int *path;
int path_num;
int **ret;
int ret_num;
void backtracking(int k,int n,int startIndex){
if(path_num==k){
int sum=0;
int *temp=(int*)malloc(sizeof(int)*k);
for(int i=0;i<k;i++){
temp[i]=path[i];
sum+=path[i];
}
if(sum==n) ret[ret_num++]=temp;
return ;
}
for(int i=startIndex;i<=9;i++){
path[path_num++]=i;
backtracking(k,n,i+1);
path_num--;
}
}
int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){
path=(int*)malloc(sizeof(int)*k);
ret=(int**)malloc(sizeof(int*)*10000);
path_num=ret_num=0;
backtracking(k,n,1);
*returnSize=ret_num;
*returnColumnSizes=malloc(sizeof(int)*ret_num);
for(int i=0;i<ret_num;i++){
(*returnColumnSizes)[i]=k;
}
return ret;
}
17. 电话号码的字母组合
题目描述:
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。
能写出来这道题我觉得自己也没有很笨,不管高效与否,至少会举一反三了。
box数组算是当作hash表了。
char box[10][5]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char *path;
int path_num;
char **ret;
int ret_num;
//k表示需要每个可能的长度,也就是digits的长度
//startIndex表示遍历到digits的下标
void backtracking(char * digits,int k,int startIndex){
//判断终止
if(path_num==k){
char* temp=(char*)malloc(k+1);
int i;
for(i=0;i<k;i++){
temp[i]=path[i];
}
temp[i]='\0';
ret[ret_num++]=temp;
return ;
}
//words中存放要组合的字符
char *words=box[digits[startIndex]-'0'];
for(int i=0;i<strlen(words);i++){
path[path_num++]=words[i];
backtracking(digits,k,startIndex+1);
path_num--;
}
}
char ** letterCombinations(char * digits, int* returnSize){
int k=strlen(digits);
path=(char*)malloc(k);
ret=(char**)malloc(sizeof(char*)*10000);
path_num=ret_num=0;
if(k==0){
*returnSize=0;
return ret;
}
backtracking(digits,k,0);
*returnSize=ret_num;
return ret;
}