本文介绍: 3、需要一个字符串s收集叶子节点结果然后用一个字符串数组result保存起来。1、需要一维数组path存放符合条件结果二维数组result存放结果集。1、定义一个二维数组例如string letterMap[10],来做映射。4、sum 为已经收集的元素总和,也就是path元素总和。5、startIndex 为下一层for循环搜索的起始位置。2、targetSum 目标和,也就是题目中的n。3、k 就是题目中要求k个数集合。:参考carl文档视频。:参考carl文档和视频。

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。

一、组合总数

思路参考carl文档和视频

1、需要一维数组path存放符合条件的结果,二维数组result存放结果集。

2、targetSum  目标和,也就是题目中的n。

3、k 就是题目中要求k个数的集合

4、sum 为已经收集的元素总和,也就是path元素总和

5、startIndex 为下一层for循环搜索的起始位置

ledcode题目:https://leetcode.cn/problems/combination-sum-iii/description/

AC代码

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;
    //从startIndex开始遍历,一直遍历到9
    for (i = startIndex; i <= 9; i++) {
        sum += i; // 处理
        path[pathTop++] = i; // 处理
        backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndex
        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);

    //设置返回的二维数组元素个数为ansTop
    *returnSize = ansTop;
    //设置二维数组中每个元素个数的大小为k
    *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);
    int i;
    for(i = 0; i < ansTop; i++) {
        (*returnColumnSizes)[i] = k;
    }
    return ans;
}

二、电话号码字母组合

思路参考carl文档和视频

1、定义一个二维数组,例如string letterMap[10],来做映射

2、用回溯解决n个for循环问题

3、需要一个字符串s来收集叶子节点的结果,然后用一个字符串数组result保存起来

lecode题目:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/

AC代码

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) {
    //若当前下标等于digits数组长度
    if(index == strlen(digits)) {
        //复制digits数组,因为最后要多存储一个0,所以数组长度要+1
        char* tempString = (char*)malloc(sizeof(char) * strlen(digits) + 1);
        int j;
        for(j = 0; j < strlen(digits); j++) {
            tempString[j] = path[j];
        }
        //char数组最后要以0结尾
        tempString[strlen(digits)] = 0;
        result[resultTop++] = tempString;
        return ;
    }
    //将字符数字转换为真的数字
    int digit = digits[index] - '0';
    //找到letterMap中对应字符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){
    //初始化path和result
    path = (char*)malloc(sizeof(char) * strlen(digits));
    result = (char**)malloc(sizeof(char*) * 300);

    *returnSize = 0;
    //若digits数组中元素个数为0,返回空集
    if(strlen(digits) == 0) 
        return result;
    pathTop = resultTop = 0;
    backTracking(digits, 0);
    *returnSize = resultTop;

    return result;
}

全篇后记:

        今天时间比较少,所以只是做到勉强理解思路。

原文地址:https://blog.csdn.net/qq_57729144/article/details/134759317

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_30062.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注