LeetCode 77 Combinations

190 阅读1分钟

LeetCode 77 Combinations

思路

  1. 递归。数组的size为k时,添加到结果集。

  2. 迭代。还是递归的思路,只不过将递归转化为迭代而已。i对应cur。

代码

递归

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        if (!k) return {{}};
        if (!n) return {};
        
        vector<vector<int>> rs;
        vector<int> com;
        
        dfs(rs, n, com, k, 1);
        
        return rs;
    }
    
    void dfs(vector<vector<int>> &rs, int n, vector<int> &com, int k, int cur) {
        if (com.size() == k) {
            rs.push_back(com);
            return ;
        }
        
        for (int i = cur; i <= n; ++i) {
            com.push_back(i);
            dfs(rs, n, com, k, i + 1);
            com.pop_back();
        }
    }
};

迭代

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> rs;
        if (n < k) return rs;
        vector<int> com(k, 0);
        int i = 0;
        
        while (i >= 0) {
            ++com[i];
            if (com[i] > n) --i;
            else if (i == k - 1) rs.push_back(com);
            else {
                ++i;
                com[i] = com[i-1];
            }
        }
        
        return rs;
    }
};