Zha*_*nan 18 c++ algorithm recursion big-o combinations
组合
给定两个整数n和k,返回1 ... n中k个数的所有可能组合.
例如,如果n = 4且k = 2,则解决方案是:Run Code Online (Sandbox Code Playgroud)[ [2, 4], [3, 4], [2, 3], [1, 2], [1, 3], [1, 4], ]
我个人认为,
时间复杂度= O(n ^ k),n和k是输入.
谢谢你的帮助.
最后,时间复杂度= O(C(n,k)*k)= O((n!/(k!*(n - k)!))*k),n和k是输入,
因为,每次当我们得到一个组合时,我们需要将子列表列表复制到one_rest,即O(k),有C(n,k)*k.
C++
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int> > combine(int n, int k) {
vector<vector<int>> list;
// Input validation.
if (n < k) return list;
int start = 1;
vector<int> subList;
helper(n, k, start, list, subList);
return list;
}
void helper(int n, int k, int start,
vector<vector<int>> &list, vector<int> &subList) {
// Base case.
if (subList.size() == k) {
vector<int> one_rest(subList);
list.push_back(one_rest);
return;
}
if (start > n) return;
for (int i = start; i <= n; i ++) {
// Have a try.
subList.push_back(i);
// Do recursion.
helper(n, k, i + 1, list, subList);
// Roll back.
subList.pop_back();
}
}
};
Run Code Online (Sandbox Code Playgroud)