算法优化的本质:去冗余
C++ / C 程序设计书单
--1、 http://zh.lucida.me/blog/developer-reading-list/ 《程序员必读书单 1.0》
http://zh.lucida.me/blog/on-learning-algorithms/ 《我的算法学习之路》
--2、《Cracking the coding interview》
http://hawstein.com/archive/ (主)
https://blog.csdn.net/hzy925/article/details/77683261
https://blog.csdn.net/wangbaochu/article/details/52976729
https://www.cnblogs.com/weixliu/p/3311774.html
--3、https://leetcode-cn.com/problemset/all/ LeetCode
---------------------------------------------------------------------------------------------------------------------------
1、迭代
2、递归
递归和迭代:两者都能很好的完成计算任务,不同之处在于思维方式上,从而导致不同的计算方法:迭代是正向思维,从头到尾思考问题;递归是逆向思维,他假设我们已经得到了部分结果(假设我已经知道了1到99的累加值,把这个值加上100我们就得到了1到100的累加值了),从尾部追溯到头部,从而让问题简化。
例子:计算从1+2+3+ ... + 99 + 100 = ?
3、分治:包含递归调用,数列中求最大最小数: https://blog.csdn.net/jeffleo/article/details/53447463
4、回溯:回溯法说白了就是穷举法。回溯法一般用递归来解决,走不通就退回再走的技术为回溯法。
5、贪心:不断贪心的选取当前最优策略的计算方法。
6、动态规划:
(1)、自顶向下的备忘录方式的动态规划方法,使用了递归,递归的时候会产生额外的开销,使用自底向上的动态规划方法要比备忘录方法好。
(2)、自底向上的动态规划;
「动态规划」中包含三个重要的概念:
- 【最优子结构】
- 【边界】
- 【状态转移公式】
动态规划和分治的区别: 区别在于这些子问题会有重叠,一个子问题在求解后,可能会再次求解,于是我们想到将这些子问题的解存储起来,当下次再次求解这个子问题时,直接拿过来就是。
1 int f(int n) {
2 if (n == 1) return 1;
3 if (n == 2) return 2;
4 // a 保存倒数第二个子状态数据,b 保存倒数第一个子状态数据, temp 保存当前状态的数据
5 int a = 1, b = 2;
6 int temp = a + b;
7 for (int i = 3; i <= n; i++) {
8 temp = a + b;
9 a = b;
10 b = temp;
11 }
12 return temp;
13 }
7、分支定界:
8、智能指针、 hashtable、 二叉树、