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;
}
相关推荐
缓风浪起1 小时前
【力扣】2011. 执行操作后的变量值
算法·leetcode·职场和发展
gsfl1 小时前
双指针算法
算法·双指针
郝学胜-神的一滴1 小时前
矩阵的奇异值分解(SVD)及其在计算机图形学中的应用
程序人生·线性代数·算法·矩阵·图形渲染
没有bug.的程序员1 小时前
分布式架构未来趋势:从云原生到智能边缘的演进之路
java·分布式·微服务·云原生·架构·分布式系统
毕业设计制作和分享3 小时前
springboot150基于springboot的贸易行业crm系统
java·vue.js·spring boot·后端·毕业设计·mybatis
he___H5 小时前
数据结构-移位
数据结构
电子_咸鱼6 小时前
LeetCode——Hot 100【电话号码的字母组合】
数据结构·算法·leetcode·链表·职场和发展·贪心算法·深度优先
仰泳的熊猫6 小时前
LeetCode:785. 判断二分图
数据结构·c++·算法·leetcode
rit84324996 小时前
基于MATLAB实现基于距离的离群点检测算法
人工智能·算法·matlab
my rainy days8 小时前
C++:友元
开发语言·c++·算法