当前位置: 首页 > article >正文

Leetcode 77. 组合 组合型回溯 C++实现

Leetcode 77. 组合

问题:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。

算法:

创建二维返回数组 ans ,和临时数组 path

进入 dfs 函数,d 代表还需要选 d 个数字(用一共要选的数字个数 k  减去  已经选过的数字个数,也就是数组 path size)。当 d==0 时证明选完了,执行完就 return 。进行递归遍历。

// 优化:当剩余元素比还需要选的元素d还要少时,没必要继续运行了,直接return。

p.s. emplace_back()push_back() 在添加 int 时二者无区别。

代码:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> ans;// 返回数组ans
        vector<int> path;// 临时数组path

        auto dfs = [&](auto&&dfs,int i){
            int d = k - path.size();// 还需要选d个
            if(d > i + 1)   return ;// 优化
            // 选好了
            if(d == 0){
                ans.emplace_back(path);// 存入ans
                return;
            }
            for(int j = i;j >= d;j--){
                path.push_back(j);// 存入path
                dfs(dfs,j - 1);// 进入下一层递归
                path.pop_back();// 恢复现场
            }
        };
        dfs(dfs,n);// 递归入口
        return ans;
    }
};

 写法2:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> ans;// 返回数组ans
        vector<int> path;// 临时数组path
        auto dfs = [&](auto &&dfs,int i,int p){// p是存入数字的个数
            if((n - (k - path.size()) + 1) < i) return ;// 优化
            if(p == k){// 个数满了可以return
                ans.emplace_back(path);
                return ;
            }// 没满执行下面
            for(int j = i;j <= n;j++){
                //选这个数的话要执行下面
                path.emplace_back(j);// 存path里
                dfs(dfs,j + 1,p + 1);// 下一层递归
                path.pop_back();// 恢复现场(清除掉path中多余的)因为还可以不选这个数
            }
        };
        dfs(dfs,1,0);// 递归入口
        return ans;
    }
};

http://www.kler.cn/a/287097.html

相关文章:

  • Java 中 HashSet 集合元素的去重
  • Unity预制体未即时刷新
  • 路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)
  • SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例
  • CentOS部署FastDFS+Nginx并实现远程访问本地服务器中文件
  • 蓝桥杯小白备考指南
  • 【STM32】红外遥控
  • 使用vue如何调用手机摄像头进行拍摄和录像
  • 【BLE】四.SMP安全配对详解
  • 抖音视频如何下载保存到相册:详细教程
  • yolo8 目标检测、鉴黄
  • java利用JXL操作excel
  • 华为OD机试(C卷,100分)- 字符串排序
  • 《JavaEE进阶》----5.<SpringMVC②剩余基本操作(CookieSessionHeader响应)>
  • 自己开发完整项目一、登录功能-03(使用springSecurity安全框架,查询用户角色权限)
  • fabricjs 完成橡皮擦
  • 艾瑞白皮书解读(四)丨深度解析企业数据治理第一步:咨询环节
  • 【解决】CentOS7 生命周期结束后 使用 yum命令报错问题
  • assert()在solidity的运用,模糊测试案例
  • 【C++】vector(下)--下篇
  • prometheus基于文件的服务发现
  • 百日草花语探秘:天长地久的情感寄托与丰富内涵解析
  • 基于Virtex UltraScale+ VU13P FPGA的4路FMC接口基带信号处理平台
  • Python测试之测试覆盖率统计
  • Linux:SQLite 数据库
  • 安卓13 鼠标右键作返回键,鼠标事件修改