https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/
https://stomachache007.wordpress.com/category/blog/
回溯
题型一:排列、组合、子集相关问题
提示:这部分练习可以帮助我们熟悉「回溯算法」的一些概念和通用的解题思路。解题的步骤是:先画图,再编码。去思考可以剪枝的条件, 为什么有的时候用 used 数组,有的时候设置搜索起点 begin 变量,理解状态变量设计的想法。 46. 全排列(中等) 47. 全排列 II(中等):思考为什么造成了重复,如何在搜索之前就判断这一支会产生重复; 39. 组合总和(中等) 40. 组合总和 II(中等) 77. 组合(中等) 78. 子集(中等) 90. 子集 II(中等):剪枝技巧同 47 题、39 题、40 题; 60. 第 k 个排列(中等):利用了剪枝的思想,减去了大量枝叶,直接来到需要的叶子结点; 93. 复原 IP 地址(中等)
题型二:Flood Fill
提示:Flood 是「洪水」的意思,Flood Fill 直译是「泛洪填充」的意思,体现了洪水能够从一点开始,迅速填满当前位置附近的地势低的区域。类似的应用还有:PS 软件中的「点一下把这一片区域的颜色都替换掉」,扫雷游戏「点一下打开一大片没有雷的区域」。
下面这几个问题,思想不难,但是初学的时候代码很不容易写对,并且也很难调试。我们的建议是多写几遍,忘记了就再写一次,参考规范的编写实现(设置 visited 数组,设置方向数组,抽取私有方法),把代码写对。 733. 图像渲染(Flood Fill,中等) 200. 岛屿数量(中等) 130. 被围绕的区域(中等) 79. 单词搜索(中等)
说明:以上问题都不建议修改输入数据,设置 visited 数组是标准的做法。可能会遇到参数很多,是不是都可以写成成员变量的问题,面试中拿不准的记得问一下面试官
题型三:字符串中的回溯问题
提示:字符串的问题的特殊之处在于,字符串的拼接生成新对象,因此在这一类问题上没有显示「回溯」的过程,但是如果使用 StringBuilder 拼接字符串就另当别论。
在这里把它们单独作为一个题型,是希望朋友们能够注意到这个非常细节的地方。 17. 电话号码的字母组合(中等),题解; 784. 字母大小写全排列(中等); 22. 括号生成(中等) :这道题广度优先遍历也很好写,可以通过这个问题理解一下为什么回溯算法都是深度优先遍历,并且都用递归来写。
题型四:游戏问题
回溯算法是早期简单的人工智能,有些教程把回溯叫做暴力搜索,但回溯没有那么暴力,回溯是有方向地搜索。「力扣」上有一些简单的游戏类问题,解决它们有一定的难度,大家可以尝试一下。 51. N 皇后(困难):其实就是全排列问题,注意设计清楚状态变量,在遍历的时候需要记住一些信息,空间换时间; 37. 解数独(困难):思路同「N 皇后问题」; 488. 祖玛游戏(困难) 529. 扫雷游戏(困难)
背包问题
- 01 背包
- 目标和:转化问题以后为 0-1 背包方案数问题。
- 分割等和子集:转化后为 0-1 背包可行性问题。
- 最后一块石头的重量 II:转化后为 0-1 背包最小值问题。
- 474. 一和零
- 879. 盈利计划
- 1230. 抛掷硬币
- 完全背包
- 零钱兑换:完全背包最小值
- 完全平方数:完全背包最小值
- 零钱兑换 II:完全背包方案数
- 组合总和 Ⅳ:考虑物品顺序的完全背包方案数。每个物品可以重复拿,有几种装满背包的方案?
- 1449. 数位成本和为目标值的最大数字
- 多维背包
- 01 字符构成最多的字符串:多维费用的 0-1 背包最大值,两个背包大小:0 和 1 的数量
- 盈利计划:多维费用的 0-1 背包最大值
- 分组背包
- 掷骰子的 N 种方法:每一组是一个骰子,每个骰子只能拿一个体积为 1 到 6 的物品
其他
- 背包问题之 01 背包问题(科普文,基础,背包九讲)
- 背包思想解决零钱兑换问题 I
- 背包思想解决零钱兑换问题(逐步优化,多方法)
- 01 背包问题之一和零
- 01 背包问题之最后一块石头的重量[Pelican]
- 背包问题之盈利计划