(二)回溯算法: 组合数

leetcode组合数

类似组合洛谷:P1157 组合的输出

问题描述

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

感悟

作为菜鸡的自己,这题一直是自己的心头之恨,上次和好友打比赛,遇到这题直接卡顿,
想法是直接暴力,k为2直接两个for循环,但是k很大,直接暴力就体现出它的局限性质了

解析

class Solution {
public:
  //创建全局变量,方便
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i <= n; i++) {
            path.push_back(i);
            backtracking(n, k, i + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }
};

其中startIndex是判断当前下标为多少开始,说实话,有点dfs的感觉,

比如最开始startIndex = 1 然后是存储就是1 然后递归到下一层startIndex就是2,当然这里的K = 2

解析为什么后面要有path.pop_back()

  • 当k = 2 的时候, 先装1 ,然后下一层的startIndex = i + 1 也就是2开始
  • 将2 存入到path容器中,这是有递归startIndex 应该为3,进入到下一层的backtracking 发现 k == path.size();回退到上一层
  • 然后就应该现在容器path 是{1, 2} 一个pop_back 变成{1} 但是还在for循环中
  • 现在i的下标是2 ,然后就i++ 就是3了

end...

posted @ 2023-03-04 09:16  壹剑霜寒十四州  阅读(7)  评论(0编辑  收藏  举报