組み合わせ
2つの整数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があります。
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();
}
}
};
リストを使用しているため、_Push_back
_および_pop_back
_はO(1)
操作です。また、有効な組み合わせを1回だけ生成することになります。したがって、複雑さはO(n choose k)
です。
複雑さはO(C(n,k))
、つまりO(n choose k)
です。
これはO(min(n^k, n^(n-k)))
と同等になります。
時間の複雑さは、存在する組み合わせの数と同じです。
この場合はn choose k
。
O(n ^ k)ではないと思います。それについて考えてください。 n = 100とk = 2と仮定しましょう。複雑さによると、100の2乗になります。しかし、n = 100でk = 10の場合、100の10乗になります。しかし、考えてみると、n = 100の組み合わせははるかに多くなります。 、k = 2はn = 100、k = 10よりも。複雑さは実際には実際の式です:これはn!/(k!(n-k)!)です。したがって、複雑さはO(n!/ k!(n-k)!)になります。