代码随想录day25| 216.组合总和III 、 17.电话号码的字母组合

216. 组合总和 III

int* path;
int pathTop;
int** ans;
int ansTop;


void backtracking(int targetSum, int k, int sum, int startIndex) {
    if(pathTop == k) {
        if(sum == targetSum) {
            int* tempPath = (int*)malloc(sizeof(int) * k);
            int j;
            for(j = 0; j < k; j++)
                tempPath[j] = path[j];
            ans[ansTop++] = tempPath;
        }
       
        return;
    }
    int i;

    for (i = startIndex; i <= 9; i++) {
        sum += i;
        path[pathTop++] = i; 
        backtracking(targetSum, k, sum, i + 1);
        sum -= i; 
        pathTop--;; 
    }
}

int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){

    path = (int*)malloc(sizeof(int) * k);
    ans = (int**)malloc(sizeof(int*) * 20);
    pathTop = ansTop = 0;

    backtracking(n, k, 0, 1);

    *returnSize = ansTop;

    *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);
    int i;
    for(i = 0; i < ansTop; i++) {
        (*returnColumnSizes)[i] = k;
    }
    return ans;
}

17. 电话号码的字母组合


  
/**  
 * Note: The returned array must be malloced, assume caller calls free().  
 */  
char* path;  
int pathTop;  
char** ans;  
int ansTop;  
  
char* letterMap[10] = {  
    "",  
    "",  
    "abc",  
    "def",  
    "ghi",  
    "jkl",  
    "mno",  
    "pqrs",  
    "tuv",  
    "wxyz"  
};  
  
void backTracking(char* digits, int index) {  
    if (index == strlen(digits)) {  
        char* temp = (char*)malloc(sizeof(char) * (strlen(digits) + 1));  
        int j;  
        for (j = 0; j < strlen(digits); j++) {  
            temp[j] = path[j];  
        }  
        temp[strlen(digits)] = '\0';  
        ans[ansTop++] = temp;  
        return;  
    }  
  
    int digit = digits[index] - '0';  
    char* letters = letterMap[digit];  
    int i;  
    for (i = 0; i < strlen(letters); i++) {  
        path[pathTop++] = letters[i];  
        backTracking(digits, index + 1);  
        pathTop--;  
    }  
}  
  
char** letterCombinations(char* digits, int* returnSize) {  
    *returnSize = 0;  
    if (strlen(digits) == 0) {  
        return ans;  
    }  
      
    path = (char*)malloc(sizeof(char) * strlen(digits));  
    ans = (char**)malloc(sizeof(char*) * 300); 
    pathTop = ansTop = 0;  
    backTracking(digits, 0);  
    *returnSize = ansTop;  
    return ans;  
}  

其实这个大体和组合这个问题差不多,这里其实将一个完整的数组分成了不同的数组,然后根据题目的要求,选择出相应的数组

这里的难点就是如何有字符串和如何将数字与字符链接起来,变成一个数组 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值