The problem Combinations Leetcode Solution provides us with two integers, n, and k. We are told to generate all the sequences that have k elements picked out of n elements from 1 to n. We return these sequences as an array. Let us go through a few examples to get a better understanding of the problem.
n = 4, k = 2
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
Explanation: The output shows all the ways of picking k elements out of first n natural numbers. Here, the ordering of the numbers does not matter. Only the collection of numbers matters.
n = 1, k = 1
[[1]]
Explanation: Here, since we have a single element. We are also told to pick a single element. Thus the output is [[1]].
Table of Contents
Approach for the Combinations Leetcode Solution
The problem Combinations Leetcode Solution asked us simply to generate all the sequences of picking k elements out of first n natural numbers. So, this is simply generating all the nCk combinations available to pick k elements. Generally, the tasks involving the generation of sequences are solved using recursion. So, we try a recursive approach to the problem. And keep track of a vector that aims to store such combinations.
So, we start with an empty vector. We push an element into it. Then recursively solve a subproblem of picking k-1 elements out of remaining n-1 elements. in this way we keep on reducing the problem until we reach the problem of picking 0 elements. When this happens, we push this temporary vector to our answer. In the end, this answer stores all the sequences of picking k elements out of n elements.

Code for Combinations Leetcode Solution
C++ Code
#include <bits/stdc++.h>
using namespace std;
void rec(int i, int k, int n, vector<int>& cur, vector<vector<int>>& res){
if(cur.size()==k) {
res.push_back(cur);
} else {
for(int j=i;j<=n;j++) {
cur.push_back(j);
rec(j+1, k, n, cur, res);
cur.pop_back();
}
}
}
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> cur;
rec(1, k, n, cur, res);
return res;
}
int main(){
vector<vector<int>> output = combine(4, 2);
for(auto singleList: output){
for(auto element: singleList)
cout<<element<<" ";
cout<<endl;
}
}
1 2 1 3 1 4 2 3 2 4 3 4
Java Code
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
static List<List<Integer>> res = new ArrayList<List<Integer>>();
public static void rec(int i, int k, int n, ArrayList<Integer> cur){
if(cur.size()==k) {
res.add(new ArrayList(cur));
} else {
for(int j=i;j<=n;j++) {
cur.add(j);
rec(j+1, k, n, cur);
cur.remove(cur.size()-1);
}
}
}
public static List<List<Integer>> combine(int n, int k) {
ArrayList<Integer> cur = new ArrayList<Integer>();
rec(1, k, n, cur);
return res;
}
public static void main (String[] args) throws java.lang.Exception{
List<List<Integer>> res = combine(4, 2);
System.out.println(res);
}
}[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
Complexity Analysis
Time Complexity
O(k*nCk), here nCk means the binomial coefficient of picking k elements out of n elements.
Space Complexity
O(nCk), as stated above the nCk here refers to the binomial coefficient.