【题目】
Given two integers n and k, return allpossible 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],
]
给定两个整数n和k,给出1-n中k个数的全排列方式
【思路】
方法一:深度优先搜索(20,16)出现超时
方法二:堆栈
【Python实现】
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
res = []
self.dfs (res, 0, n, k, [])
return res
def dfs(self, res, i, n, k, temp):
if k == 0:
res.append(temp)
return
for i in range(i+1, n + 1):
self.dfs (res, i, n, k-1, temp+[i])
if __name__ == '__main__':
S= Solution2()
S.combine(4, 2)
方法二:
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
ans = []
stack = []
x = 1
while True:
len_stack = len(stack)
if len_stack == k:
ans.append(stack[:])
if len_stack == k or x > n - k + len_stack + 1:
if not stack:
return ans
x = stack.pop() + 1
else:
stack.append(x)
x += 1
if __name__ == '__main__':
S= Solution2()
S.combine(4, 2)