防止所有層的重複訪問
通過visted[i]或者used[i]的置位和復位,標記
def __dfs(self, nums, visited, depth=0, pre=[], output=[]):
if depth == len(nums):
output.append(pre[:])
return
for i in range(len(nums)):
if not visited[i]:
# 置位visted[i]表示此刻訪問,下一層以下都不能訪問
visited[i] = True
self.__dfs(nums, visited, depth + 1, pre + [nums[i]], output)
# 復位visted[i]
visited[i] = False
return output
防止當前層的重複訪問
直接在當前層前設置 dp = dict(),以此標記當前層。
這種情況下,當前的dic被標記,進入下一層前,當前dic被壓入棧,下一層重新賦值爲空{}, 從而保證了每一層不會重複訪問。
def dfs(start, tmp):
dic = {}
if len(tmp) > 1:
res.append(tmp)
for i in range(start, len(nums)):
if dic.get(nums[i], 0):
continue
if len(tmp) == 0 or nums[i] >= tmp[-1]:
dic[nums[i]] = 1
dfs(i + 1, tmp + [nums[i]])