leetcodealgorithms-templates5-backtracking
 
 
 
// Given n numbers (1 - n), return all possible combinations
// of size k. (n choose k math problem).
// Time: O(k * 2^n)
function combinations(n, k) {
    let combs = []
    helper(1, [], combs, n, k);
    return combs;
}
 
function helper(i, curComb, combs, n, k) {
    if (curComb.length == k) {
        combs.push([...curComb]);
        return;
    }
    if (i > n) {
        return;
    }
    // decision to include i
    curComb.push(i);
    helper(i + 1, curComb, combs, n, k);
    curComb.pop();
    
    // decision to NOT include i
    helper(i + 1, curComb, combs, n, k);
}
 
 
// Time: O(k * C(n, k))
function combinations2(n, k) {
    let combs = [];
    helper2(1, [], combs, n, k);
    return combs;
}
 
function helper2(i, curComb, combs, n, k) {
    if (curComb.length == k) {
        combs.push([...curComb]);
        return;
    }
    if (i > n) {
        return;
    }
    for (let j = i; j < n + 1; j++) {
        curComb.push(j);
        helper2(j + 1, curComb, combs, n, k);
        curComb.pop();
    }
}