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;
}
相关推荐
杰克尼几秒前
蓝桥云课-5. 花灯调整【算法赛】
java·开发语言·算法
.小墨迹几秒前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu
wanghowie2 分钟前
01.02 Java基础篇|核心数据结构速查
java·开发语言·数据结构
乂爻yiyao6 分钟前
java并发演进图
java
java1234_小锋7 分钟前
Redis6为什么引入了多线程?
java·redis
努力学算法的蒟蒻8 分钟前
day38(12.19)——leetcode面试经典150
算法·leetcode·面试
9号达人11 分钟前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
看见繁华13 分钟前
C++ 设计模式&设计原则
java·c++·设计模式
搬砖魁首16 分钟前
ZK-ALU-在有限域上实现乘法和除法
算法·zk·alu·域运算·算术逻辑单元·模乘·蒙哥马利模约简
爱笑的眼睛1120 分钟前
超越AdamW:优化器算法的深度实现、演进与自定义框架设计
java·人工智能·python·ai