Problem Statement
Given two integers n
and k
, return all possible combinations of k
numbers chosen from the range [1, n]
. You may return the answer in any order.
LeetCode:
Constraints
1 <= n <= 20
1 <= k <= n
Examples
Example 1:
Input; n = 4, k = 2
Output: [
[1, 2],
[1, 3],
[1, 4],
[2, 3],
[2, 4],
[3, 4]
]
Explanation: There are 4 choose 2 = 6 total combinations.
Note that combinations are unordered, i.e., [1,2] and [2,1] are considered to be the same combination.
Example 2:
Input: n = 1, k = 1
Output: [
[1]
]
Explanation: There is 1 choose 1 = 1 total combination.
Different Approaches
1️⃣ Backtracking
We use a recursive approach to build combinations incrementally, starting from 1 up to n
.
At each step:
- You can choose the current number.
- Move to the next number (to avoid duplicates and maintain order).
- Stop when your current combination has
k
elements.
Code:
void backtrack(int start, int n, int k, vector<int>& temp, vector<vector<int>>& res) {
// If the current combination is of size k, add to result
if (temp.size() == k) {
res.push_back(temp);
return;
}
// Iterate through remaining numbers starting from 'start'
for (int i = start; i <= n; ++i) {
temp.push_back(i); // Choose i
backtrack(i + 1, n, k, temp, res); // Recurse with i + 1
temp.pop_back(); // Backtrack
}
}
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> temp;
backtrack(1, n, k, temp, res);
return res;
}
Complexity Analysis:
- Time Complexity:
O(C(n, k) × k)
- Total combinations = C(n, k) (binomial coefficient)
- Each combination takes O(k) time to construct.
- Space Complexity:
O(k)
(recursion stack depth) + O(C(n, k) × k) for result