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

目录

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

解析代码


力扣77. 组合

77. 组合

难度 中等

给定两个整数 n 和 k,返回范围 [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(); // 恢复现场
        }
    }
};
相关推荐
Eyfcom11 分钟前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
qq_406981031 小时前
c++拷贝构造函数
开发语言·c++
bro_Java6661 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐1 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮2 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers2 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
文丑颜不良啊2 小时前
LeetCode2081~2100题目解析
java·leetcode
H.莓飛3 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla3 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi3 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法