zoukankan      html  css  js  c++  java
  • [LeetCode] Combinations

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

    For example,
    If n = 4 and k = 2, a solution is:

    [
      [2,4],
      [3,4],
      [2,3],
      [1,2],
      [1,3],
      [1,4],
    ]
    
    Hide Tags
     Backtracking
     
    思路:DFS,类似于backtrace
    class Solution {
        vector<vector<int> > m_res;
        vector<int>  m_array;
        public:
            void dfs(int n, int k, int start)
            {   
                if(k == m_array.size())
                {   
                    m_res.push_back(m_array);
                    return;
                }   
                for(int i = start; i <= n; i++)
                {   
                    m_array.push_back(i);
                    dfs(n, k, i + 1); 
                    m_array.pop_back();
                }   
    
            }   
    
            vector<vector<int> > combine(int n, int k)
            {   
                dfs(n, k, 1); 
                return m_res;
            }   
    };

    思路2:子集树的标准写法略加变形,更好理解的dfs其实是这样:

    class Solution {
        vector<vector<int> > m_res;
        vector<int>  m_array;
        public:
            void dfs(int n, int k, int dep)
            {   
                if(k == m_array.size())
                {   
                    m_res.push_back(m_array);
                    return;
                }   
    
                if(dep > n)
                    return;
    
                for(int i = 0; i< 2 ;i++)
                {   
                    if(i == 0)
                    {   
                        m_array.push_back(dep);
                        dfs(n, k, dep+ 1); 
                        m_array.pop_back();
                    }   
                    else
                    {   
                        dfs(n, k, dep+1);
                    }   
                }   
    
            }   
    
            vector<vector<int> > combine(int n, int k)
            {   
                dfs(n, k, 1); 
                return m_res;
            }
    };

     思路3:对思路2中包含不包含做一下精简:

    class Solution {
        vector<vector<int> > m_res;
        vector<int>  m_array;
        public:
            void dfs(int n, int k, int dep)
            {   
                if(k == m_array.size())
                {   
                    m_res.push_back(m_array);
                    return;
                }   
    
                if(dep > n)
                    return;
    
                // contain the element
                m_array.push_back(dep);
                dfs(n, k, dep+ 1);
                m_array.pop_back();
    
                // don't contain the element
                dfs(n, k, dep+1); 
                  
    
            }   
    
            vector<vector<int> > combine(int n, int k)
            {   
                dfs(n, k, 1); 
                return m_res;
            }
    };
  • 相关阅读:
    C++学习9 this指针详解
    福建省第八届 Triangles
    UVA 11584 Partitioning by Palindromes
    POJ 2752 Seek the Name, Seek the Fame
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    HDU 2988 Dark roads(kruskal模板题)
    HDU 1385 Minimum Transport Cost
    HDU 2112 HDU Today
    HDU 1548 A strange lift(最短路&&bfs)
  • 原文地址:https://www.cnblogs.com/diegodu/p/4335129.html
Copyright © 2011-2022 走看看