每日OJ题_DFS回溯剪枝⑦_力扣77. 组合

目录

[力扣77. 组合](#力扣77. 组合)

解析代码


力扣77. 组合

77. 组合

难度 中等

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

复制代码
输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:

复制代码
输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n
cpp 复制代码
class Solution {
public:
    vector<vector<int>> combine(int n, int k) {

    }
};

解析代码

题目要求我们从 1 到 n 中选择 k 个数的所有组合,其中不考虑顺序。也就是说,[1,2] 和 [2,1] 等价。我们需要找出所有的组合,但不能重复计算相同元素的不同顺序的组合。对于选择组合,我们需要进行如下流程:

  1. 所有元素分别作为首位元素进行处理。
  2. 在之后的位置上同理,选择所有元素分别作为当前位置元素进行处理。
  3. 为避免计算重复组合,规定选择之后位置的元素时必须比前一个元素大,这样就不会有重复的组合 ([1,2] 和 [2,1] 中 [2,1] 不会出现)。
cpp 复制代码
class Solution {
    int _n, _k;
    vector<int> path;
    vector<vector<int>> ret;
public:
    vector<vector<int>> combine(int n, int k) {
        _n = n;
        _k = k;
        dfs(1);
        return ret;
    }

    void dfs(int pos)
    {
        if(path.size() == _k)
        {
            ret.push_back(path);
            return;
        }

        for(int i = pos; i <= _n; ++i) // 剪枝
        {
            path.push_back(i);
            dfs(i + 1);
            path.pop_back(); // 恢复现场
        }
    }
};
相关推荐
过往入尘土12 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.12 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
Dream it possible!12 小时前
LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219_C++_简单)
leetcode·面试·散列表
蒙奇D索大12 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
洲覆13 小时前
C++ 模板、泛型与 auto 关键字
开发语言·数据结构·c++
智驱力人工智能13 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测
学学学无无止境13 小时前
组合两个表-力扣
leetcode
千里马-horse13 小时前
Async++ 源码分析7--parallel_reduce.h
开发语言·c++·async++·parallel_reduce
江公望13 小时前
Qt QThread使用方法入门浅解
c++·qt
程序员爱钓鱼13 小时前
Go语言实战案例——进阶与部署篇:编写Makefile自动构建Go项目
后端·算法·go