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;
}
相关推荐
Leinwin3 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
无极低码3 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
薛定谔的悦3 小时前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
软件算法开发3 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
enjoy嚣士3 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
罗超驿4 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
superior tigre4 小时前
22 括号生成
算法·深度优先
盐水冰4 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
凸头5 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言