77. Combinations
- Total Accepted: 96007
- Total Submissions: 258054
- Difficulty: Medium
- Contributors: Admin
Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
For example,
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
Code
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
res = []
path = []
self.helper(range(1, 1+n), k, 0, path, res)
return res
def helper(self, l, k, start_idx, path, res):
if k == 0:
res.append(list(path))
return
for i in xrange(start_idx, len(l)-k+1):
path.append(l[i])
self.helper(l, k-1, i+1, path, res)
path.pop()
Idea
What I use is backtracking dfs, which is a common algorithm applied in many questions, for example: https//nb4799.neu.edu/wordpress/?p=2416.
The parameters of helper function:
l: the original list containing 1 ~ n
path: the numbers already added into a temporary list
k: how many numbers still needed to form a combination
start_idx: the next number to be added should be searched in the range from start_idx to end of the original list
res: the result list
Another elegant recursive solution: https://discuss.leetcode.com/topic/12537/a-short-recursive-java-solution-based-on-c-n-k-c-n-1-k-1-c-n-1-k