深度遍历模板及三个例题

0、深度遍历模板(个人总结):

def dfs(arr, t):
    # 满足条件
    if 满足输出条件:
        输出解
        return

    # 如果传入的条件还能继续搜下去  分析每一种情况后跟着那种情况  循环每一种情况
    for i in range(len(arr)):
        if 满足进一步搜索的条件:
            做标记(下一步需要的状态)
            dfs(arr, t+1)   # 可以尽可能将状态变化写进去 ,这样就不需要对该状态回溯了
            恢复标记(回溯)

1、题目

    (1)题目1  输入数 n 输出 1-n的全排列
             输入3
             输出 123 132 213 231 321 312

def dfs11(n, k, tempstr, alllist):
    # 满足条件
    if k == n:
        # if int(tempstr) % 2 == 0:    # 如果要求值为偶数
            alllist.append(tempstr) # 必须要添加它的拷贝
    for i in range(1, n+1):
        if str(i) not in tempstr:
            dfs11(n, k+1, tempstr+str(i), alllist)

tempstr, alllist = '', []
dfs11(3,0,tempstr,alllist)
print(alllist)

    (2)题目2 输入数组 nums 返回数组的全部子集
             输入 [1,2,3]
             输出  [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]

# 该函数可返回  子集长度是 k 时的所有子集
def dfs2(nums, k, curk, tempset, alllist):
    # 满足条件
    if curk == k:
        # 去alllist中的重
        temp = list(tempset)
        temp.sort()
        if temp not in alllist:
            alllist.append(temp)

    # 搜索每一种可能
    for i in range(len(nums)):
        # 满足递归条件
        if nums[i] not in tempset:
            tempset.add(nums[i])
            dfs2(nums, k, curk+1, tempset, alllist)
            tempset.remove(nums[i])

def findsubset(nums):
    alllist = [[]]
    tempset = set()
    for i in range(1, len(nums)+1):
        dfs2(nums, i, 0, tempset, alllist)
    return alllist

# print(findsubset([1,3,2]))


    (3)题目3 输入数组 [1,2,3,4] 判断数组中是否有 两个数的和 等于 第三个数
             输入[1,2,3,4]
             输出 [[1,2,3],[1,3,4]]

def dfs3(nums, k, curk, templist, alllist, flags):
    if curk == k:
        templist.sort()
        if sum(templist[:2]) == templist[-1] and templist not in alllist:
            alllist.append(templist.copy())
        return

    for i in range(len(nums)):
        if i not in flags:  # 避免 1 1 2 这种情况   当i没有被选中时候进来
            flags.append(i)
            templist.append(nums[i])
            dfs3(nums, k, curk+1, templist, alllist, flags)
            flags.remove(i)
            templist.remove(nums[i])

templist, alllist,flags = [], [],[]

dfs3([1,2,3,4,5],3,0,templist,alllist,flags)
print(alllist)

路虽远,行则将至。事虽难,做则必成 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值