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], ]
太可怕了,我一开始用python做,测试数据中[20, 16]大家可以试试,自己跑的时候用了50多秒,直接超时,改成java做就没这回事了,附上两段代码,大家自己看。回来补坑了,python的ac代码。
python代码(AC)
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
stack = []
res = []
l, x = 0, 1
while True:
if l == k:
res.append(stack[:])
if l == k or n-x+1 < k-l:
if not stack:
return res
x = stack.pop() + 1
l -= 1
else:
stack.append(x)
x += 1
l += 1
python版本(超时)
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
ans = []
self.count = 0
def dfs(start, nums):
if self.count == k:
ans.append(nums)
return
for i in range(start, n+1):
self.count += 1
dfs(i+1, nums+[i])
self.count -= 1
dfs(1, [])
return ans
java版本(AC)
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> temp = new ArrayList<Integer>();
dfs(res, temp, n, k, 1);
return res;
}
private void dfs(List<List<Integer>> res, List<Integer> temp, int n, int k, int m) {
if(k == 0) {
res.add(new ArrayList<Integer>(temp));
return;
}
for(int i=m; i<=n; i++) {
temp.add(i);
dfs(res, temp, n, k-1, i+1);
temp.remove(temp.size()-1);
}
}
}