Skip to content

Commit add2288

Browse files
committed
🎉 add: 算法-概览
1 parent 41bdae0 commit add2288

File tree

7 files changed

+157
-19
lines changed

7 files changed

+157
-19
lines changed

README.md

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -156,19 +156,27 @@
156156

157157
## 查找
158158

159+
- [查找-概览](/算法分类/查找/查找.md)
159160
- [二维数组查找](/算法分类/查找/二维数组查找.md)⭐⭐
160161
- [在排序数组中查找数字](/算法分类/查找/在排序数组中查找数字.md)⭐⭐
161162
- [整数中1出现的次数](/算法分类/查找/整数中1出现的次数.md)⭐⭐
162163

164+
165+
## DFS和BFS
166+
167+
- [DFS和BFS-概览](/算法分类/DFS和BFS/DFS和BFS.md)
168+
163169
## 递归和循环
164170

171+
- [递归-概览](/算法分类/递归和循环/递归.md)
165172
- [斐波拉契数列](/算法分类/递归和循环/斐波拉契数列.md)⭐⭐
166173
- [跳台阶](/算法分类/递归和循环/跳台阶.md)⭐⭐
167174
- [变态跳台阶](/算法分类/递归和循环/变态跳台阶.md)⭐⭐
168175
- [矩形覆盖](/算法分类/递归和循环/矩形覆盖.md)⭐⭐
169176

170177
## 回溯算法
171178

179+
- [回溯-概览](/算法分类/回溯算法/回溯算法.md)
172180
- [二叉树中和为某一值的路径](/算法分类/回溯算法/二叉树中和为某一值的路径.md)⭐⭐⭐
173181
- [字符串的排列](/算法分类/回溯算法/字符串的排列.md)⭐⭐⭐
174182
- [和为sum的n个数](/算法分类/回溯算法/和为sum的n个数.md)⭐⭐⭐
@@ -179,28 +187,13 @@
179187

180188
## 动态规划
181189

190+
- [动态规划-概览](/算法分类/动态规划/动态规划.md)
182191
- [斐波拉契数列](/算法分类/递归和循环/斐波拉契数列.md)⭐⭐
183192

193+
## 贪心算法
194+
195+
- [贪心算法-概览](/算法分类/贪心算法/贪心算法.md)
184196

185-
## 更新计划
186-
187-
- 贪心算法
188-
- 解题指南-二叉树
189-
- 解题指南-数组
190-
- 解题指南-字符串
191-
- 解题指南-链表
192-
- 解题指南-栈和队列
193-
- 解题指南-哈希表
194-
- 解题指南-平衡树
195-
- 解题指南-图
196-
- 解题指南-堆
197-
- 解题指南-数学
198-
- 解题指南-排序
199-
- 解题指南-查找
200-
- 解题指南-回溯算法
201-
- 解题指南-贪心算法
202-
- 解题指南-分治算法
203-
- 解题指南-动态规划
204197

205198
## 关于
206199

算法分类/DFS和BFS/DFS和BFS.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
### 广度优先搜索
2+
3+
广度优先搜索(`BFS`)是一种遍历或搜索数据结构(如树或图)的算法,也可以在更抽象的场景中使用。
4+
5+
它的特点是越是接近根结点的结点将越早地遍历。
6+
7+
例如,我们可以使用 `BFS` 找到从起始结点到目标结点的路径,特别是最短路径。
8+
9+
`BFS`中,结点的处理顺序与它们添加到队列的顺序是完全相同的顺序,即先进先出,所以广度优先搜索一般使用队列实现。
10+
11+
- [从上到下打印二叉树](http://www.conardli.top/docs/dataStructure/二叉树/从上到下打印二叉树.html)
12+
- [单词接龙](https://leetcode-cn.com/problems/word-ladder/)
13+
- [员工的重要性](https://leetcode-cn.com/problems/employee-importance/)
14+
- [岛屿数量](https://leetcode-cn.com/problems/number-of-islands/)
15+
16+
### 深度优先搜索
17+
18+
和广度优先搜索一样,深度优先搜索(`DFS`)是用于在树/图中遍历/搜索的一种重要算法。
19+
20+
`BFS` 不同,更早访问的结点可能不是更靠近根结点的结点。因此,你在`DFS` 中找到的第一条路径可能不是最短路径。
21+
22+
![](https://i.loli.net/2019/08/19/uNAkPfLY9HRjVQU.png)
23+
24+
`DFS`中,结点的处理顺序是完全相反的顺序,就像它们被添加到栈中一样,它是后进先出。所以深度优先搜索一般使用栈实现。
25+
26+
- [二叉树的中序遍历](http://www.conardli.top/docs/dataStructure/%E4%BA%8C%E5%8F%89%E6%A0%91/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86.html)
27+
- [二叉树的最大深度](http://www.conardli.top/docs/dataStructure/二叉树/二叉树的最大深度.html)
28+
- [路径总和](https://leetcode-cn.com/problems/path-sum/)
29+
- [课程表](https://leetcode-cn.com/problems/course-schedule/)
30+
- [岛屿数量](https://leetcode-cn.com/problems/number-of-islands/)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
动态规划往往是最能有效考察算法和设计能力的题目类型,面对这类题目最重要的是抓住问题的阶段,了解每个阶段的状态,从而分析阶段之间的关系转化。
2+
3+
适用于动态规划的问题,需要满足最优子结构和无后效性,动态规划的求解过程,在于找到状态转移方程,进行自底向上的求解。
4+
5+
![](https://i.loli.net/2019/08/18/3roOnqlBDEP5RZN.jpg)
6+
7+
自底向上的求解,可以帮你省略大量的复杂计算,例如上面的斐波拉契数列,使用递归的话时间复杂度会呈指数型增长,而动态规划则让此算法的时间复杂度保持在`O(n)`
8+
9+
### 路径问题
10+
11+
- [最小路径和](https://leetcode-cn.com/problems/minimum-path-sum/)
12+
- [不同路径](https://leetcode-cn.com/problems/unique-paths/)
13+
- [不同路径 II](https://leetcode-cn.com/problems/unique-paths-ii/)
14+
- [形成字符串的最短路径](https://leetcode-cn.com/problems/shortest-way-to-form-string)
15+
16+
### 买卖股票类问题
17+
18+
- [买卖股票的最佳时机](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock)
19+
- [买卖股票的最佳时机 III](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii)
20+
- [打家劫舍](https://leetcode-cn.com/problems/house-robber)
21+
- [打家劫舍 II](https://leetcode-cn.com/problems/house-robber-ii/)
22+
23+
### 子序列问题
24+
25+
- [不同的子序列](https://leetcode-cn.com/problems/distinct-subsequences)
26+
- [乘积最大子序列](https://leetcode-cn.com/problems/maximum-product-subarray)
27+
- [最长上升子序列](https://leetcode-cn.com/problems/longest-increasing-subsequence)
28+
- [最长回文子序列](https://leetcode-cn.com/problems/longest-palindromic-subsequence)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
从解决问题每一步的所有可能选项里系统选择出一个可行的解决方案。
2+
3+
在某一步选择一个选项后,进入下一步,然后面临新的选项。重复选择,直至达到最终状态。
4+
5+
回溯法解决的问题的所有选项可以用树状结构表示。
6+
7+
- 在某一步有n个可能的选项,该步骤可看作树中一个节点。
8+
- 节点每个选项看成节点连线,到达它的n个子节点。
9+
- 叶节点对应终结状态。
10+
- 叶节点满足约束条件,则为一个可行的解决方案。
11+
- 叶节点不满足约束条件,回溯到上一个节点,并尝试其他叶子节点。
12+
- 节点所有子节点均不满足条件,再回溯到上一个节点。
13+
- 所有状态均不能满足条件,问题无解。
14+
15+
![](https://i.loli.net/2019/08/19/GZkQ7gx9CHsb2hd.png)
16+
17+
> 回溯算法适合由多个步骤组成的问题,并且每个步骤都有多个选项。
18+
19+
- [二叉树中和为某一值的路径](http://www.conardli.top/docs/algorithm/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E5%92%8C%E4%B8%BA%E6%9F%90%E4%B8%80%E5%80%BC%E7%9A%84%E8%B7%AF%E5%BE%84.html)
20+
- [字符串的排列](http://www.conardli.top/docs/algorithm/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%8E%92%E5%88%97.html)
21+
- [和为sum的n个数](http://www.conardli.top/docs/algorithm/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/%E5%92%8C%E4%B8%BAsum%E7%9A%84n%E4%B8%AA%E6%95%B0.html)
22+
- [矩阵中的路径](http://www.conardli.top/docs/algorithm/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E8%B7%AF%E5%BE%84.html)
23+
- [机器人的运动范围](http://www.conardli.top/docs/algorithm/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%9A%84%E8%BF%90%E5%8A%A8%E8%8C%83%E5%9B%B4.html)
24+
- [N皇后问题](http://www.conardli.top/docs/algorithm/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95/N%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98.html)

算法分类/查找/查找.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
查找是计算机中最基本也是最有用的算法之一。 它描述了在有序集合中搜索特定值的过程。
2+
3+
![](https://i.loli.net/2019/08/18/Tq6OW3iBvRljHM4.png)
4+
5+
二分查找维护查找空间的左、右和中间指示符,并比较查找目标或将查找条件应用于集合的中间值;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半上继续查找,直到成功为止。如果查以空的一半结束,则无法满足条件,并且无法找到目标。
6+
7+
- [二维数组查找](http://www.conardli.top/docs/algorithm/%E6%9F%A5%E6%89%BE/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E6%9F%A5%E6%89%BE.html)
8+
- [旋转数组的最小数字](http://www.conardli.top/docs/algorithm/%E6%9F%A5%E6%89%BE/%E6%97%8B%E8%BD%AC%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%80%E5%B0%8F%E6%95%B0%E5%AD%97.html#%E9%A2%98%E7%9B%AE)
9+
- [在排序数组中查找数字](http://www.conardli.top/docs/dataStructure/%E6%95%B0%E7%BB%84/%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E5%AD%97.html)
10+
- [x 的平方根](https://leetcode-cn.com/problems/sqrtx/?utm_source=LCUS&utm_medium=ip_redirect_q_uns&utm_campaign=transfer2china)
11+
- [猜数字大小](https://leetcode-cn.com/problems/guess-number-higher-or-lower/)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
贪心算法:对问题求解的时候,总是做出在当前看来是最好的做法。
3+
4+
适用贪心算法的场景:问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。这种子问题最优解成为最优子结构
5+
6+
![](https://i.loli.net/2019/08/18/ZqOBvnsPUFVzXWp.jpg)
7+
8+
### 买卖股票类问题
9+
10+
- [买卖股票的最佳时机 II](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/)
11+
- [买卖股票的最佳时机含手续费](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee)
12+
13+
### 货币选择问题
14+
15+
- [零钱兑换](https://leetcode-cn.com/problems/coin-change)
16+
- [零钱兑换 II](https://leetcode-cn.com/problems/coin-change-2)
17+
18+
19+
贪心算法与动态规划的不同在于它对每个子问题的解决方案都作出选择,不能回退,动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能,而回溯算法就是大量的重复计算来获得最优解。
20+
21+
![](https://i.loli.net/2019/08/18/HQge7bvB6SWdotp.jpg)
22+
23+
有很多算法题目都是可以用这三种思想同时解答的,但是总有一种最适合的解法,这就需要不断的练习和总结来进行深入的理解才能更好的选择解决办法。
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用。
3+
4+
![](https://i.loli.net/2019/08/19/fJgzFyM6WvXGOi7.png)
5+
6+
你可能想知道如何实现调用自身的函数。诀窍在于,每当递归函数调用自身时,它都会将给定的问题拆解为子问题。递归调用继续进行,直到到子问题无需进一步递归就可以解决的地步。
7+
8+
为了确保递归函数不会导致无限循环,它应具有以下属性:
9+
10+
- 一个简单的基本案例 —— 能够不使用递归来产生答案的终止方案。
11+
- 一组规则,也称作递推关系,可将所有其他情况拆分到基本案例。
12+
13+
### 重复计算
14+
15+
一些问题使用递归考虑,思路是非常清晰的,但是却不推荐使用递归,例如下面的几个问题:
16+
17+
- [斐波拉契数列](http://www.conardli.top/docs/algorithm/递归和循环/斐波拉契数列.html)
18+
- [跳台阶](http://www.conardli.top/docs/algorithm/递归和循环/跳台阶.html)
19+
- [矩形覆盖](http://www.conardli.top/docs/algorithm/%E9%80%92%E5%BD%92%E5%92%8C%E5%BE%AA%E7%8E%AF/%E7%9F%A9%E5%BD%A2%E8%A6%86%E7%9B%96.html)
20+
21+
这几个问题使用递归都有一个共同的缺点,那就是包含大量的重复计算,如果递归层次比较深的话,直接会导致JS进程崩溃。
22+
23+
![](https://i.loli.net/2019/08/19/fA3okFVIMlxS1Q6.jpg)
24+
25+
你可以使用`记忆化`的方法来避免重复计算,即开辟一个额外空间来存储已经计算过的值,但是这样又会浪费一定的内存空间。因此上面的问题一般会使用动态规划求解。
26+
27+
> 所以,在使用递归之前,一定要判断代码是否含有重复计算,如果有的话,不推荐使用递归。
28+
29+
递归是一种思想,而非一个类型,很多经典算法都是以递归为基础,因此这里就不再给出更多问题。

0 commit comments

Comments
 (0)