update
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
这些算法全部自己敲一遍:
|
这些算法全部自己敲一遍:
|
||||||
|
|
||||||
**二叉树**
|
###二叉树
|
||||||
二叉树
|
二叉树
|
||||||
二叉查找树
|
二叉查找树
|
||||||
Trie树(前缀树)
|
Trie树(前缀树)
|
||||||
@@ -34,16 +34,18 @@ R树
|
|||||||
斐波那契堆(Fibonacci Heap)
|
斐波那契堆(Fibonacci Heap)
|
||||||
|
|
||||||
|
|
||||||
**哈希表/散列表 (Hash Table)**
|
###哈希表/散列表 (Hash Table)
|
||||||
|
|
||||||
|
|
||||||
**字符串算法**
|
###字符串算法
|
||||||
|
|
||||||
BF算法
|
BF算法
|
||||||
KMP算法
|
KMP算法
|
||||||
BM算法
|
BM算法
|
||||||
|
|
||||||
|
|
||||||
**图的算法**
|
###图的算法
|
||||||
|
|
||||||
图的存储结构和基本操作(建立,遍历,删除节点,添加节点)
|
图的存储结构和基本操作(建立,遍历,删除节点,添加节点)
|
||||||
最小生成树
|
最小生成树
|
||||||
拓扑排序
|
拓扑排序
|
||||||
@@ -52,15 +54,23 @@ BM算法
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
**排序算法(八大排序)**
|
### 排序算法
|
||||||
快排
|
|
||||||
插入排序 : 希尔排序
|
*交换排序算法*
|
||||||
选择排序 : 堆排序
|
插入排序
|
||||||
|
选择排序
|
||||||
|
希尔排序
|
||||||
|
|
||||||
|
堆排序
|
||||||
|
快排
|
||||||
归并排序
|
归并排序
|
||||||
|
|
||||||
|
|
||||||
|
*线性排序算法*
|
||||||
基数排序
|
基数排序
|
||||||
|
|
||||||
|
|
||||||
**查找算法**
|
### 查找算法
|
||||||
顺序表查找:顺序查找
|
顺序表查找:顺序查找
|
||||||
有序表查找:二分查找
|
有序表查找:二分查找
|
||||||
分块查找: 块内无序,块之间有序;可以先二分查找定位到块,然后再到`块`中顺序查找 中使用顺序查找(这里之所以叫 `动态查找表`,是因为表结构是查找的过程中动态生成的)
|
分块查找: 块内无序,块之间有序;可以先二分查找定位到块,然后再到`块`中顺序查找 中使用顺序查找(这里之所以叫 `动态查找表`,是因为表结构是查找的过程中动态生成的)
|
||||||
@@ -69,7 +79,7 @@ BM算法
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
**15个经典基础算法**
|
###15个经典基础算法
|
||||||
|
|
||||||
A*寻路算法: 求解最短路径
|
A*寻路算法: 求解最短路径
|
||||||
Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)
|
Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)
|
||||||
@@ -108,21 +118,23 @@ http://www.chinaunix.net/old_jh/23/437639.html
|
|||||||
|
|
||||||
## 推荐阅读
|
## 推荐阅读
|
||||||
|
|
||||||
|
*刷题必备*
|
||||||
《数据结构与算法分析》
|
《剑指offer》
|
||||||
《编程之美》
|
《编程之美》
|
||||||
《算法设计与分析基础》
|
《编程珠玑》Programming Pearls 偏算法理论
|
||||||
|
《编程珠玑(续)》
|
||||||
|
《More Programming Pearls》 偏算法轶事
|
||||||
|
|
||||||
|
|
||||||
|
《数据结构与算法分析》
|
||||||
|
《算法设计与分析基础》
|
||||||
《算法导论》 告诉你有哪些算法
|
《算法导论》 告诉你有哪些算法
|
||||||
《算法引论》 告诉你如何创造算法 断货
|
《算法引论》 告诉你如何创造算法 断货
|
||||||
|
|
||||||
《剑指offer》
|
|
||||||
|
|
||||||
|
|
||||||
*侧重经典算法的实现*
|
*侧重经典算法的实现*
|
||||||
《Elements of Programming》 STL代码 快 准 狠 ,写出的代码可以上层次
|
《Elements of Programming》 STL代码 快 准 狠 ,写出的代码可以上层次
|
||||||
《C interfaces and Implementation》
|
《C interfaces and Implementation》
|
||||||
|
|
||||||
《The practice of programming》 Brian Kernighan和Rob Pike
|
《The practice of programming》 Brian Kernighan和Rob Pike
|
||||||
|
|
||||||
《微软的梦工厂》
|
《微软的梦工厂》
|
||||||
@@ -134,9 +146,6 @@ http://www.chinaunix.net/old_jh/23/437639.html
|
|||||||
|
|
||||||
《Algorithm Design Manual》 红皮书
|
《Algorithm Design Manual》 红皮书
|
||||||
|
|
||||||
《编程珠玑》Programming Pearls 偏算法理论
|
|
||||||
《More Programming Pearls》 偏算法轶事
|
|
||||||
|
|
||||||
《The science of programming》 证明代码段的正确性 800块一本
|
《The science of programming》 证明代码段的正确性 800块一本
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -130,10 +130,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 动态规划
|
### 动态规划DP
|
||||||
|
|
||||||
复杂问题不能分解成几个子问题,而分解成一系列子问题;
|
复杂问题不能分解成几个子问题,而分解成一系列子问题;
|
||||||
|
|
||||||
|
DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。
|
||||||
|
|
||||||
|
状态
|
||||||
|
状态转移方程
|
||||||
|
递推关系
|
||||||
|
|
||||||
动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余`
|
动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余`
|
||||||
|
|
||||||
使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势
|
使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势
|
||||||
@@ -151,6 +157,7 @@
|
|||||||
|
|
||||||
案例
|
案例
|
||||||
|
|
||||||
|
LIS 最长递增子序列(longest increasing subsequence)
|
||||||
最短路径
|
最短路径
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+14
-10
@@ -3,14 +3,13 @@
|
|||||||
|
|
||||||
如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列头到队列尾的元素个数(包含队列头、队列尾)(华赛面试题、腾讯笔试题)。
|
如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列头到队列尾的元素个数(包含队列头、队列尾)(华赛面试题、腾讯笔试题)。
|
||||||
|
|
||||||
|
分析:
|
||||||
有rear指针时:
|
有rear指针时:
|
||||||
|
|
||||||
if rear>front count = rear-front+1
|
if rear>front count = rear-front+1
|
||||||
else count = rear-front+m+1
|
else count = rear-front+m+1
|
||||||
综合,count = (rear-front+m+1)%m
|
综合,count = (rear-front+m+1)%m
|
||||||
|
|
||||||
不用rear指针的话:
|
不用rear指针的话:
|
||||||
|
|
||||||
数据结构中加一个 int count来计数。
|
数据结构中加一个 int count来计数。
|
||||||
|
|
||||||
|
|
||||||
@@ -29,8 +28,7 @@ push一个元素a时,该元素a与辅助栈顶f[top]元素比较:
|
|||||||
a > f[top],在辅助栈再次中push一遍f[top] (可以把这个省去,节省空间,代价是pop的时候要跟最小栈元素比较,如果pop元素跟最小栈栈顶相等,可能最小值要变了)
|
a > f[top],在辅助栈再次中push一遍f[top] (可以把这个省去,节省空间,代价是pop的时候要跟最小栈元素比较,如果pop元素跟最小栈栈顶相等,可能最小值要变了)
|
||||||
a < f(top),把 a push 到 辅助栈中
|
a < f(top),把 a push 到 辅助栈中
|
||||||
|
|
||||||
这样辅助栈中的元素是 从上到小 递增的数列。
|
这样辅助栈中的元素是 从上到小 递增的数列。且 辅助栈中的栈顶元素 总是 栈中元素集合的最小值。
|
||||||
且 辅助栈中的栈顶元素 总是 栈中元素集合的最小值。
|
|
||||||
|
|
||||||
以上方法需要的空间复杂度是O(n)
|
以上方法需要的空间复杂度是O(n)
|
||||||
|
|
||||||
@@ -38,11 +36,8 @@ a < f(top),把 a push 到 辅助栈中
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
栈的push、pop序列
|
栈的push、pop序列
|
||||||
题目:输入两个整数序列。其中一个序列表示栈的push顺序,
|
题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。
|
||||||
判断另一个序列有没有可能是对应的pop顺序。
|
|
||||||
为了简单起见,我们假设push序列的任意两个整数都是不相等的。
|
|
||||||
|
|
||||||
比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
|
比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
|
||||||
因为可以有如下的push和pop序列:
|
因为可以有如下的push和pop序列:
|
||||||
@@ -52,7 +47,6 @@ push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
|
|||||||
|
|
||||||
|
|
||||||
这里只是要判断是不是pop序列,并没有要求所有的pop序列
|
这里只是要判断是不是pop序列,并没有要求所有的pop序列
|
||||||
|
|
||||||
需要一个辅助栈(需要一个写好的栈结构辅助,如果是C语言,还要包装一个栈结构)
|
需要一个辅助栈(需要一个写好的栈结构辅助,如果是C语言,还要包装一个栈结构)
|
||||||
|
|
||||||
对序列A中的A[0]入栈,比较B[0]
|
对序列A中的A[0]入栈,比较B[0]
|
||||||
@@ -72,7 +66,17 @@ push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
|
|||||||
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。
|
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。
|
||||||
颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。
|
颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。
|
||||||
|
|
||||||
递归方法
|
思路一:所有元素pop出来,放到一个数组里,然后在从第一个元素开始入栈,空间复杂度需要 O(N)
|
||||||
|
|
||||||
|
思路二: 递归方法。把栈看出2部分 :1 和 {2,3,4,5} , 把栈{2,3,4,5}颠倒过来,然后把1放到底部,那整个栈就颠倒过来了。
|
||||||
|
|
||||||
|
void reverseStack(){
|
||||||
|
|
||||||
|
stack.pop();
|
||||||
|
reverseStack();
|
||||||
|
addTopToStackBottom();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+19
-1
@@ -416,7 +416,7 @@ X0+X1+...+ = 10;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
|
约瑟夫环问题。n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
|
||||||
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
|
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
|
||||||
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
|
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
|
||||||
求出在这个圆圈中剩下的最后一个数字。
|
求出在这个圆圈中剩下的最后一个数字。
|
||||||
@@ -428,6 +428,11 @@ X0+X1+...+ = 10;
|
|||||||
第四次删除:2
|
第四次删除:2
|
||||||
因此,左后的一个数字就是 4
|
因此,左后的一个数字就是 4
|
||||||
|
|
||||||
|
从数学上分析下规律:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交。"
|
用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交。"
|
||||||
@@ -443,6 +448,11 @@ X0+X1+...+ = 10;
|
|||||||
3:(*.*, 0.0, *.*)
|
3:(*.*, 0.0, *.*)
|
||||||
4:(*.*, 0.0, *.*)
|
4:(*.*, 0.0, *.*)
|
||||||
|
|
||||||
|
分析:
|
||||||
|
|
||||||
|
2个形状不相交:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -654,6 +664,14 @@ void reorder(int *data, int length);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
如何求2个集合的交集
|
||||||
|
|
||||||
|
1.每个集合里面是否有重复元素?
|
||||||
|
|
||||||
|
思路一:hash,复杂度O(M+N)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
|
有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
|
||||||
如 [-1, 3, 5, 9] 绝对值最小的是2(5-3)
|
如 [-1, 3, 5, 9] 绝对值最小的是2(5-3)
|
||||||
|
|||||||
Reference in New Issue
Block a user