代码随想录训练营第二十五天|216. 组合总和 III、17. 电话号码的字母组合

 目录

 216. 组合总和 III

17. 电话号码的字母组合


 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值