




Sponsored
Sponsored
This method uses a backtracking technique, where we recursively build each combination by adding numbers incrementally and backtrack whenever we've constructed combinations of size k or cannot extend further.
Time Complexity: O(C(n, k) * k), where C(n, k) is the binomial coefficient. Each combination is built in O(k) time.
Space Complexity: O(k) due to the recursion stack storing the current combination.
1def combine(n, k):
2    def backtrack(start, curr):
3        if len(curr) == k:
4            result.append(curr[:])
5            return
6        for i in range(start, n+1):
7            curr.append(i)
8            backtrack(i+1, curr)
9            curr.pop()
10
11    result = []
12    backtrack(1, [])
13    return result
14
15print(combine(4, 2))The Python implementation uses a local helper function backtrack to recursively explore possible combinations, leveraging Python's list's natural dynamic size for convenient management of the current list of numbers being explored.
Bit masking provides a novel way to generate combinations by representing choice decisions (e.g., pick or skip) in binary. A bit mask is applied to the set of numbers [1...n], and for each bit position, if the bit is set, that number is included in the combination.
Time Complexity: O(2n * n), as we iterate over all possible subsets of [1...n] and check the bit count.
Space Complexity: O(C(n, k) * k) for storing all combinations.
1#include <vector>
std::vector<std::vector<int>> combine(int n, int k) {
    std::vector<std::vector<int>> result;
    int total = 1 << n;
    for (int mask = 0; mask < total; ++mask) {
        if (__builtin_popcount(mask) == k) {
            std::vector<int> current;
            for (int i = 0; i < n; ++i) {
                if (mask & (1 << i)) {
                    current.push_back(i + 1);
                }
            }
            result.push_back(current);
        }
    }
    return result;
}
int main() {
    int n = 4, k = 2;
    std::vector<std::vector<int>> combinations = combine(n, k);
    for (const auto& combo : combinations) {
        std::cout << "[";
        for (size_t i = 0; i < combo.size(); ++i) {
            std::cout << combo[i];
            if (i < combo.size() - 1) std::cout << ", ";
        }
        std::cout << "]\n";
    }
    return 0;
}In C++, we traverse numbers 0 to 2n-1, representing each as a bitmask. We use the __builtin_popcount function to count 1s in the mask, equating to picking elements for a combination.