Combinations:
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.
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.
Input: n = 1, k = 1
Output: [[1]]
Explanation: There is 1 choose 1 = 1 total combination.
1 <= n <= 20
1 <= k <= n
Try this Problem on your own or check similar problems:
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result = new ArrayList<>();
helper(n, k, 1, new ArrayList<>(), result);
return result;
}
private void helper(int n, int k, int start, List<Integer> currentList, List<List<Integer>> result){
if(currentList.size() == k){
result.add(new ArrayList<>(currentList));
return;
}
for(int i = start; i <= n; ++i){
currentList.add(i);
helper(n, k, i + 1, currentList, result);
currentList.remove(currentList.size() - 1);
}
}
}
It’s almost identical to the
Permutations
solution with only one change (you can extract this info from the problem statement too) combinations are unordered
[1,2] and [2,1] are considered to be the same combination.
. So the loop begins at start
and for every deeper recursion call start
increases (in other words it doesn’t matter if we place start
at first or second position if all other picked numbers are the same).
As discussed in
Subsets II
the complexity for generating combinations is (n!/((n-k)! * k!))
but also we have a multiplier n
since we’re copying the list to the result. If we omit the space complexity for the result, we only have O(k)
(depth of recursion and size of the set).
Don’t settle for anything less than the crown. Join our newsletter and become the King of Interviews! Click here to join now and get the latest updates.