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. Combinations, 78. 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