leetcode77.组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

解题思路

1.回溯函数终止条件

什么时候到达所谓的叶子节点了呢?

path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。

2。单层搜索的过程

回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。

回溯法模版

c 复制代码
void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

回溯法(未剪枝)

c 复制代码
int *path;
 int pathTop;
 int **ans;
 int ansTop;
 void  backTracking(int n,int k,int startIndex){
    if(pathTop==k){
        int* tmp=(int*)malloc(sizeof(int)*k);
        for(int i=0;i<k;i++){
            tmp[i]=path[i];
        }
        ans[ansTop++]=tmp;
        return;
    }
    for(int j=startIndex;j<=n;j++){
        path[pathTop++]=j;
         backTracking(n,k,j+1);
         pathTop--;
    }
 }
int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {
    path=(int*)malloc(sizeof(int)*k);
    ans=(int**)malloc(sizeof(int*)*200001);
    pathTop=ansTop=0;
    backTracking(n,k,1);
    *returnSize=ansTop;//组合个数
    *returnColumnSizes=(int*)malloc(sizeof(int)*(*returnSize));//每个组合的个数
    for(int i=0;i<*returnSize;i++)
    (*returnColumnSizes)[i]=k;
    return ans;
}

回溯法(剪枝)

c 复制代码
int *path;
 int pathTop;
 int **ans;
 int ansTop;
 void  backTracking(int n,int k,int startIndex){
    if(pathTop==k){
        int* tmp=(int*)malloc(sizeof(int)*k);
        for(int i=0;i<k;i++){
            tmp[i]=path[i];
        }
        ans[ansTop++]=tmp;
        return;
    }
    for(int j=startIndex;j<=n-(k-pathTop)+1;j++){
        path[pathTop++]=j;
         backTracking(n,k,j+1);
         pathTop--;
    }
 }
int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {
    path=(int*)malloc(sizeof(int)*k);
    ans=(int**)malloc(sizeof(int*)*200001);
    pathTop=ansTop=0;
    backTracking(n,k,1);
    *returnSize=ansTop;//组合个数
    *returnColumnSizes=(int*)malloc(sizeof(int)*(*returnSize));//每个组合的个数
    for(int i=0;i<*returnSize;i++)
    (*returnColumnSizes)[i]=k;
    return ans;
}
相关推荐
q***2512 分钟前
java进阶1——JVM
java·开发语言·jvm
while(1){yan}3 分钟前
线程的状态
java·开发语言·jvm
豐儀麟阁贵5 分钟前
8.3 Java常见的异常类
java·开发语言
20岁30年经验的码农6 分钟前
Java JVM 技术详解
java·jvm·压力测试
1***81538 分钟前
C在游戏中的场景管理
java·jvm·游戏
q***448113 分钟前
Java进阶10 IO流
java·开发语言
济宁雪人20 分钟前
Java安全基础——文件系统安全
java·开发语言·安全
20岁30年经验的码农24 分钟前
Java RabbitMQ 实战指南
java·开发语言·python
非著名架构师30 分钟前
极端天气下的供应链韧性:制造企业如何构建气象风险防御体系
大数据·人工智能·算法·制造·疾风气象大模型·风光功率预测
星轨初途38 分钟前
数据结构排序算法详解(2)——选择排序(附动图)
c语言·数据结构·经验分享·笔记·b树·算法·排序算法