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