摘要: 回溯: 递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯。下一个状态在开始之前需要利用到之前的状态,此时需要进行回溯,因为之前的状态对现在的状态存在着影响。 剪枝: 深度优先搜索的时候如果已经明确 阅读全文
posted @ 2019-02-01 23:58 |旧市拾荒| 阅读(336) 评论(0) 推荐(0) 编辑
摘要: 题目: 有一个大小为 N*M 的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对 W 的*的部分) 限制条件:N, M ≤ 100 样例输入: 园子如下图('W'表示积水, '.'表示没有积水) 输出: 思路: 这道题目很经典,值得以后多去研 阅读全文
posted @ 2019-02-01 22:44 |旧市拾荒| 阅读(1174) 评论(0) 推荐(0) 编辑
摘要: 题目: 给定整数序列a1,a2,...,an,判断是否可以从中选出若干数,使它们的和恰好为k。1≤n≤20 -108≤ai≤108 -108≤k≤108 输入: 输出: 思路: 这里记录一下为什么会想到用子集去做这道题目,这道题目是关于从几个数中找出几个关于符合某种关系的数,呐,根据模式匹配法很容易 阅读全文
posted @ 2019-02-01 18:32 |旧市拾荒| 阅读(436) 评论(0) 推荐(0) 编辑
摘要: DFS(深度优先搜索): 深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行 阅读全文
posted @ 2019-02-01 16:33 |旧市拾荒| 阅读(803) 评论(0) 推荐(0) 编辑
摘要: 对于一些算法问题,求次数,种类数(答案就是一个具体的数值)这些,如果有封闭形式就可以直接解,就不用去编码大量的代码了。那我们看一个例子吧。 汉诺塔移动次数: 我们以前是求汉诺塔的移动方式,那现在要求移动多少次,那该怎么做呢?我们可以先看汉诺塔的移动次数递归式 f(n) = 2f(n-1)+1 。那是 阅读全文
posted @ 2019-02-01 12:05 |旧市拾荒| 阅读(782) 评论(0) 推荐(0) 编辑
摘要: 题目: 编写一个方法,确定某字符串的所有排列组合。 解法一: 代码: 结果: 解法二:交换法,大体意思就是不开辟新的辅助空间,直接在原有的数组中进行两个元素的交换即可,但是要注意这种方法必须要进行回溯。 代码: 结果: 例题: LeetCode60 n个数的排列组合找出第k个排列。 思路:在上面的代 阅读全文
posted @ 2019-02-01 10:52 |旧市拾荒| 阅读(1511) 评论(0) 推荐(0) 编辑
摘要: 题目: 给定一个int数组A和数组的大小n,编写一个方法返回集合A的所有子集。注意集合里面的元素互异。 解这道题的思想本质上就是元素选与不选的问题。由此大概有三种方法解这道题。 递归法:如果只有一个元素,那么它的子集有两个,分别是本身和空集,然后在已经有一个元素的子集的基础上,第二个元素有两种选法, 阅读全文
posted @ 2019-02-01 00:01 |旧市拾荒| 阅读(690) 评论(0) 推荐(0) 编辑