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]]

  

posted @ 2022-05-10 21:56  zhaojiabo  阅读(43)  评论(0)    收藏  举报