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;
}
相关推荐
breaksoftware33 分钟前
Java版Flink使用指南——分流导出
java·flink·ruby
hit、run2 小时前
通过,注解@value,读取配置文件中的数据(并设置默认值)
java
小鹿( ﹡ˆoˆ﹡ )2 小时前
Java:构造函数与对象
java·开发语言·python
续亮~2 小时前
7、Redis 队列与 Stream
数据结构·数据库·redis·缓存·哈希算法
机智的土拨鼠2 小时前
解决本地操作云服务器上的Redis
java·linux·服务器·windows·redis·ubuntu
如果'\'真能转义说3 小时前
Java常用的API_02(正则表达式、爬虫)
java·爬虫·正则表达式
明湖底的炼丹炉3 小时前
混合贪心算法求解地铁线路调度
算法·贪心算法
真的想不出名儿3 小时前
正则表达式
java·正则表达式
云边有个稻草人5 小时前
【C语言】自定义类型:联合和枚举
c语言·开发语言·算法
hummhumm6 小时前
数据结构第18节 散列表 - 应用
java·数据结构·spring boot·spring cloud·java-ee·maven·散列表