数据结构之回溯

回溯思想作为最常见算法思维之一,在数据结构中也常常使用。除了三大常用的算法思维(递归、动态规划、回溯)。
一般还包括二分查找、快慢指针、左右指针、滑动窗口、前缀和数组、差分数组。只是后面的几种不太常见而已。

回溯解题思路三件套

  1. 路径:也就是已经做出的选择。
  2. 选择列表:也就是你当前可以做的选择。
  3. 结束条件:也就是到达决策树底层,无法再做选择的条件。

回溯算法使用时还需要递归思路辅助

回溯算法较其他两种算法思维更好理解,常用的技巧也不太复杂。因此只讲解一个实例。

代码框架:

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

其核心套路就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」。

集合划分: 排列组合问题

问题描述: 在给定的集合中,划分等和的n等分。

解题代码:

def canPartitionKSubsets(nums: list, k: int):
        if (k > len(nums)):
            return False
        num_sum = 0
        for v in nums:
            num_sum += v
        if (num_sum % k != 0):
            return False
        bucket = [0 for _ in range(k)]
        target = int(num_sum / k)
        return backtrack(nums, 0, bucket, target)

    def backtrack(nums, index, bucket, target):
        # 检查所有的划分是否相等
        if (index == len(nums)):
            i = 0
            while i < len(bucket): 
                if (bucket[i] != target):
                    return False
                i += 1
            return True

        i = 0
        while i < len(bucket): 
            ## 细节处理重点
            if (bucket[i] + nums[index] > target):
                i += 1  
                continue
            ## 回溯算法核心思想
            bucket[i] += nums[index]
            if (backtrack(nums, index + 1, bucket, target)):
                return True
            bucket[i] -= nums[index]
            i += 1 
        return False
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,342评论 0 13
  • 1.基础数据结构类型 (1)线性结构 数组、链表、栈、队列 (2)非线性结构 树、图 2.数据结构变体 数组扩展:...
    ack_Finding阅读 5,899评论 0 0
  • 涉及的几个部分数据结构部分数组、栈、链表、队列、树、图 数组 数组是最简单、也是使用最广泛的数据结构。栈、队列等其...
    飞扬code阅读 8,468评论 0 18
  • 剑指offer线性数据结构 剑指offer是找工作开始后刷的第一本书,刷题用牛客网。这本书可以说是已经总结归纳的很...
    锅锅Iris阅读 4,581评论 0 2
  • 为什么学习数据结构与算法? 关于数据结构和算法,以前只是看过一些零散的文章或者介绍,从来都没有系统的去学习过。随着...
    李大酱的大脖子阅读 4,464评论 0 0