leetcode77.组合,python实现需要注意的点,S不能看作栈
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
正常回溯实现;
开始代码:
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
ans = []
def backtrack(i,S):
if len(S)>k:
return
if len(S) == k:
ans.append(S)
return
for j in range(i,n+1):
S.append(j)
backtrack(j+1,S)
S.pop()
# print(ans)
S =[]
backtrack(1,S)
return ans
输出
[[1, 2]] [[1, 3], [1, 3]] [[1, 4], [1, 4], [1, 4]] [[1], [1], [1]] [[2, 3], [2, 3], [2, 3], [2, 3]] [[2, 4], [2, 4], [2, 4], [2, 4], [2, 4]] [[2], [2], [2], [2], [2]] [[3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4]] [[3], [3], [3], [3], [3], [3]] [[4], [4], [4], [4], [4], [4]] [[], [], [], [], [], []] [[], [], [], [], [], []]
原因:ans随着S更新,一直在维护一个S,把S当作了一个栈,一直在进出操作,导致ans也跟着改变。
更改:在递归过程中更新S,无需回退操作,每一次递归调用结束后,直接回到前一次的S。
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
ans = []
def backtrack(i,S):
if len(S)>k:
return
if len(S) == k:
ans.append(S)
return
for j in range(i,n+1):
# S.append(j)
backtrack(j+1,S+[j])
# S.pop()
# print(ans)
S =[]
backtrack(1,S)
return ans
结果:
[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]

浙公网安备 33010602011771号