LeetCode DFS & Backtracking系列: 17, 46, 47, 77, 78, 90, 286, 76, 93题解系列2:(77,78,90) (python)

LeetCode 17, 46, 47, 77, 78, 90, 286, 79, 93: DFS & Backtracking方法题解 (python)

描述:

DFS 是一种非常重要的算法思想,也有很多具体的应用。这里简单总结一下LeetCode中比较基础,比较典型的DFS / Backtracking法的应用。在这里试图总结出一个“通用”的模版,以及一些题需要的注意的点。

链接: 17. Letter Combinations of a Phone Number.
链接: 46. Permutations.
链接: 47. Permutations II.
链接: 77. Combinations.
链接: 78. Subsets.
链接: 90. Subsets II.
链接: 286. Walls and Gates.
链接: 79. Word Search.
链接: 93. Restore IP Addresses.

系列2: 77. Combinations78. Subsets., 90. Subsets II

77. Combinations.
思路:又是一道排序问题。直接dfs,没什么特殊的。
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        self.result = []
        self.dfs(n, k, 1, [])
        return self.result
    def dfs(self, n, k, start, res):
        if k==0:
            self.result.append(res)
        for i in range(start, n+1):
            self.dfs(n, k-1, i+1, res+[i])
总结:

还是跟之前的套路一样,只不过这里没有数组了,但是处理还是一样的。注意循环要写成n+1,不然会少排列一组。

78. Subsets.
思路:

一样的dfs。由于对加入到结果的子数组没有要求,所以每次调用dfs函数都可以添加一次。注意排序

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        if not nums:
            return []
        self.result = []
        self.dfs(sorted(nums), 0, [])
        return self.result
    def dfs(self, nums, start, res):
        self.result.append(res)
        for i in range(start, len(nums)):
            self.dfs(nums, i+1, res+[nums[i]])
90. Subsets II.
思路:

和78题一样。但是给的数组里有重复值。这样就要用到之前提到的去重方法。

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        self.result = []
        self.dfs(sorted(nums), 0, [])
        return self.result
    def dfs(self, nums, start, res):
        self.result.append(res)
        for i in range(start, len(nums)):
            if i>start and nums[i-1]==nums[i]:  #去重的套路
                continue
            self.dfs(nums, i+1, res+[nums[i]])

总结:

排列问题,组合问题,要想到DFS / Backtracking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值