Day 24 | 回溯

54 阅读1分钟

回溯算法

本质:递归函数

纯暴力 针对for循环暴力也无法解决的问题

  • 组合问题 数组中符合条件的组合结果 【强调无序】
  • 切割问题 给定str,切割子串
  • 子集问题
  • 排列问题 【强调元素顺序】
  • 棋盘问题 n皇后

抽象为树形结构

宽度:for实现

深度:递归

# 模板
def recursion(*args):
    if (end condition):
        store in res
        return 
    
    # search by layer
    for :
        node operation
        recursion()
        recursion operation  # back upper layer
    return

77. 组合

理解回溯的模板

因为是组合问题,函数参数需要定义起始位置,保证res中的集合不重复

def combine(self, n: int, k: int) -> List[List[int]]:
    path = []
    res = []

    def recursion(n, j, k):
        if len(path) == k:
            res.append(path[:])
            return
        
        for i in range(j, n):
            path.append(i)
            recursion(n, i+1, k)
            path.pop()

    recursion(n+1, 1, k)

    return res