Backtracking:通常是用在需要纪录路径的 DFS 时。
常见的 itertools 中会用到的 combination, permutation 还有 subset 的实作。
都可以试试看用 backtracking 做,当然也可以用 DP。
77. Combinations
46. Permutations
78. Subsets
对於一般新手来说,一开始可能比较难理解这部分的递回,或是容易把不同的解法搞混。
在写 subsets 时,我一开始不太会构建我的递回,
虽然知道要有 base case,要有递回的部分,和 return,但常常还是写得乱七八糟。
尤其是对於阵列的元素到底要 append 还是用 +=?现在拿到的 list 有可能为空吗?等等
要仔细想清楚。
这个错误其实也不是特别针对 backtracking,而是要纪录状态或元素时可能会不小心搞错的。
以 subsets 这类型题目为例:
def subsets(self, nums: List[int]) -> List[List[int]]:
if not nums:
return [[]]
l = self.subsets(nums[:-1])
ans = [term + [nums[-1]] for term in l] + l
return ans
e.append(nums[i])
会回传 None,所以只能用 +ans = []
for i in range(len(nums)):
ans += ([[nums[i]]] + [[nums[i]] + e for e in ans])
def backtrack(first = 0, cur):
if len(cur) == k: # 到达深度 k
output.append(cur[:])
return
for i in range(first, n):
cur.append(nums[i])
backtrack(i + 1, cur)
cur.pop() # 恢复状态再去加下一个数字
对於 backtracking,
只要知道自己在干嘛,顺着思路,
自然而然在某个地方就是需要做状态的恢复,
才能去试试下一条路。
因为关心的不只是最後找到的元素,而是整条 dfs 的路线。
对於 combinations 来说,这条路线就是其中一个合法的 combination,只要找到用完全部元素的那条(也就是到达最深的深度)就纪录、return、恢复前一动。
对於 matrix 中找单字(昨天提的 word search) 来说,这条路线就是目前找到的 substring,只要发现下一步找到的元素不能组成 target,就恢复上一动;如果找到了,就回传 true
>>: 应用 LINE Front-end Framework 轻松建立互动 (3)
今天进入到全新的篇章 Redux 了! Redux 是 React.js 中很常拿来作为状态管理使...
昨天架设完Python环境後, 今天要开始架设Python API的专案, 而我们今天使用的是Fla...
Pass Salesforce Omni Studios accreditation on the ...
22 - Design Pattern(2) - Presenter Presenter patte...
常见的 HTML elements 标题 headings 在 VS code 中输入以下程序码 &...