查找所有组合的算法的时间复杂度是多少?
给定两个整数n和k,返回1 … n中k个数字的所有可能组合。
,如果n = 4且k = 2,则解为:
[
[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被输入,
因为每次当我们得到一个组合时,我们需要将subList列表复制到one_rest,即O(k),即C(n,k) k。
#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();
}
}
};
回答:
由于您正在使用列表,push_back
并且pop_back
是O(1)
操作。同样,您最终只生成一次有效的组合。因此,复杂度为O(n choose
k)。
以上是 查找所有组合的算法的时间复杂度是多少? 的全部内容, 来源链接: utcz.com/qa/431959.html