dfs中防止重複訪問/回溯用到的兩種方法的區別

防止所有層的重複訪問

通過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]])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章