@ 代码随想录算法训练营第4周(C语言)|Day25(回溯)
Day25、回溯(包含题目 ● 216.组合总和III● 17.电话号码的字母组合 )
216.组合总和III
题目描述
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
题目解答
int **res;
int *path;
int reslen;
int pathlen;
void bfs(int k,int n,int sum,int startindex){
if(sum>n){
return;
}
if(pathlen==k){
if(sum==n){
int* temp=(int*)malloc(sizeof(int)*k);
for(int i=0;i<k;i++){
temp[i]=path[i];
}
res[reslen++]=temp;
}
return;
}
for(int i=startindex;i<=9;i++){
path[pathlen++]=i;
sum+=i;
bfs(k,n,sum,i+1);
pathlen--;
sum-=i;
}
}
int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes) {
res=(int**)malloc(sizeof(int*)*1000);
path=(int*)malloc(sizeof(int)*k);//出现错误的原因就是前面全局变量定义过的,就不用再次定义了,负责会出现 store to null pointer of type 'int'
reslen=pathlen=0;
bfs(k,n,0,1);
*returnSize=reslen;
*returnColumnSizes=(int*)malloc(sizeof(int)*reslen);
for(int i=0;i<reslen;i++){
(*returnColumnSizes)[i]=k;
}
return res;
}
题目总结
出现错误的原因就是前面全局变量定义过的,就不用再次定义了,负责会出现 store to null pointer of type ‘int’。
电话号码的字母组合
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
题目解答
char*path;
int pathlen;
char**res;
int reslen;
char* lettermap[10] = {"", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz", //9
};
void bfs(char*digits,int index){
if(index==strlen(digits)){
char*temp=(char*)malloc(sizeof(char)*(strlen(digits)+1));
for(int i=0;i<strlen(digits);i++){
temp[i]=path[i];
}
temp[strlen(digits)]=0;
res[reslen++]=temp;
return;
}
int digit=digits[index]-'0';//复制digits数组,因为最后要多存储一个0,所以数组长度要+1
char*letters=lettermap[digit];
for(int i=0;i<strlen(letters);i++){
path[pathlen++]=letters[i];
bfs(digits,index+1);
pathlen--;
}
}
char** letterCombinations(char* digits, int* returnSize) {
path=(char*)malloc(sizeof(char)*strlen(digits));
res=(char**)malloc(sizeof(char*)*300);
*returnSize=0;
if(strlen(digits)==0){
return res;
}
pathlen=reslen=0;
bfs(digits,0);
*returnSize=reslen;
return res;
}
题目总结
回溯不难,找对应字母难。