leetcode 77组合

简介: leetcode 77组合

组合


0216633bc75b4e3eb69137bc922cdb3b.png

递归是深度,for是广度

n=4 ,k =2 ,两层递归,for遍历4

回溯遍历法

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    //left是for的开始 ,right是for的结束。当size==k的时候递归结束
    void tarversal(int left , int right , int k)
    {
        if(path.size() == k)
        {
            result.push_back(path);
            return;
        }else
        {
            for(int i= left ; i <= right ; i++)
            {
                path.push_back(i);
                tarversal(i+1 ,right , k);
                path.pop_back();
            }
            return;
        }
    }
    vector<vector<int>> combine(int n, int k) {
        tarversal(1,n,k);
        return result;
    }
};

回溯剪枝

剪枝是减少无意义循环的过程


928377f65c284d598525a3eef60a3a51.png

当输入是n=4,k=4的时候,只有1234符合。我们遍历到2开始时,最多为234,234的长度为3满足长度为4的情况,是无意义的,要剪去。


for(int i= left ; i <= right - (k - path.size()) +1 ; i++) 为剪枝的判断


其中left为遍历的开始,right为遍历的结束。现在还需要找到k - path.size()个点

即 right - left => (k - path.size()) ,为剩下的点可以满足k的要求

=>left <= right - (k - path.size()) +1 , 其中+1为满足左边闭合。

例,k=3,n=4时,已经选取的为0个(path.size()=0),带入i <= right - ( k - path.size() ) +1 , i <= 4 - (3-0)+1 ,为i<=2。


即当i最大为从2开始满足,为234 。大于2 剪枝

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void tarversal(int left , int right , int k)
    {
        if(path.size() == k)
        {
            result.push_back(path);
            return;
        }else
        {
           //i <= right - (k - path.size()) +1为剪枝的过程,避免无意义的循环
            for(int i= left ; i <= right - (k - path.size()) +1 ; i++)
            {
                path.push_back(i);
                tarversal(i+1 ,right , k);
                path.pop_back();
            }
            return;
        }
    }
    vector<vector<int>> combine(int n, int k) {
        tarversal(1,n,k);
        return result;
    }
};

二刷

class Solution {
public:
    vector<vector<int>> result;
    vector<int> combinNum;
    void track_back(int n , int k ,int fir)
    {
        if(combinNum.size() == k)
        {
            result.push_back(combinNum);
            return;
        }
        for(int i=fir+1 ; i<=n ; i++)
        {
            combinNum.push_back(i);
            track_back(n,k,i);
            combinNum.pop_back();
        }
        return;
    }
    vector<vector<int>> combine(int n, int k) {
        track_back(n,k,0);
        return result;
    }
};
相关文章
|
4月前
|
算法
LeetCode第77题组合
文章通过树形结构的遍历方法解决了LeetCode第77题"组合",使用递归算法生成所有可能的组合,并总结了将组合问题转换为树遍历的解题技巧。
LeetCode第77题组合
|
2月前
【LeetCode 49】77.组合
【LeetCode 49】77.组合
14 0
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
|
6月前
|
SQL 算法 大数据
力扣175题:组合两个表(含模拟描述)
力扣175题:组合两个表(含模拟描述)
|
7月前
|
Java
leetcode-77:组合
leetcode-77:组合
33 0
|
算法
代码随想录算法训练营第二十六天 | LeetCode 39. 组合总和、40. 组合总和 II、131. 分割回文串
代码随想录算法训练营第二十六天 | LeetCode 39. 组合总和、40. 组合总和 II、131. 分割回文串
50 0
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
34 0
|
算法 Java 网络架构
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串
|
C++
C++ leetcode之排列与组合专题
C++ leetcode之排列与组合专题
89 0
|
存储 算法
LeetCode:77. 组合——回溯法,是暴力法?
题目描述:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。