(回溯) LeetCode 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

二. 解题思路

本题意思是给定一个数字n 以及 k ,在1到n 中找到组合大小位k 的所有可能输出,可能有些同学想到了使用for循环去遍历,但是单传使用for循环去嵌套遍历有两个缺点:(1)首先你不知道k的大小,不能够确定各for循环的嵌套次数;(2)其次,即便你知道了k的值,使用for循环去嵌套遍历,那如果题目中给你100个数,k的值为50,让你在100个数中找出所有组合大小为50的组合数,你难道还想用50层for循环去遍历吗???当然不行,那么这里我们就选择回溯:

回溯其实也是for循环的一种体现,通过递归的思想实现对组合数的判断,也是一种暴力的做法,不过比for循环好。

话不多说!!!上代码!!

三. 代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void back(int n, int k, int startindex){
        if(path.size() == k){        //如果达到了组合数的要求就退出
            res.push_back(path);
            return;
        }
        for(int i = startindex; i <= n; i++){
            path.push_back(i);
            back(n, k, i + 1);
            path.pop_back();       // 回溯:到上一个阶段
        }

    }
    vector<vector<int>> combine(int n, int k) {
        back(n, k, 1);
        return res;
    }
};

四. 总结

对于回溯算法,本身比较抽象,也晦涩难懂,需要多加练习和理解,掌握原理即可,加油!!

时间复杂度:O(N∗K);

空间复杂度:O(N∗K)。

喜欢的话给个关注吧!!

相关推荐
搞科研的小刘选手34 分钟前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议
拉姆哥的小屋37 分钟前
从混沌到秩序:条件扩散模型在图像转换中的哲学与技术革命
人工智能·算法·机器学习
Sammyyyyy42 分钟前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
sin_hielo1 小时前
leetcode 2110
数据结构·算法·leetcode
Jay20021111 小时前
【机器学习】33 强化学习 - 连续状态空间(DQN算法)
人工智能·算法·机器学习
panzer_maus2 小时前
归并排序的简单介绍
java·数据结构·算法
摆烂且佛系2 小时前
B+树的“页分裂“机制
数据结构·b树
cici158742 小时前
二值化断裂裂缝的智能拼接算法
人工智能·算法·计算机视觉
麦格芬2302 小时前
LeetCode 763 划分字母区间
算法·leetcode·职场和发展
福尔摩斯张3 小时前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法