查找所有组合的算法的时间复杂度是多少?

给定两个整数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_backO(1)操作。同样,您最终只生成一次有效的组合。因此,复杂度为O(n choose

k)

以上是 查找所有组合的算法的时间复杂度是多少? 的全部内容, 来源链接: utcz.com/qa/431959.html

回到顶部