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

Zha*_*nan 18 c++ algorithm recursion big-o combinations

组合
给定两个整数n和k,返回1 ... n中k个数的所有可能组合.
例如,如果n = 4且k = 2,则解决方案是:

[
   [2, 4],
   [3, 4],
   [2, 3],
   [1, 2],
   [1, 3],
   [1, 4],
]
Run Code Online (Sandbox Code Playgroud)


我个人认为,
时间复杂度= 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)

Nuc*_*man 16

复杂性就是O(C(n,k))这样O(n choose k).

这最终相当于O(min(n^k, n^(n-k))).


mer*_*011 6

时间复杂度等于组合的数量.

在这种情况下它是n choose k.


Pra*_*han 5

因为您正在使用列表,push_back并且pop_backO(1)操作.此外,您最终只生成一次有效组合.因此,复杂性是O(n choose k).