第1-2章:
衡量算法:时间复杂度和空间复杂度
时间复杂度:重复基本操作的运行的次数
空间复杂度:一次基本操作需要执行的步骤次数
增长次数:log2n < n < n*log2n < n^2 < n^3 < 2^n < n!
最优情况:算法运行最快的时候。
最差情况:算法运行时间最长的时候。
平均效率:在典型或随机的情况下,算法会是什么情况。(顺序查找平均效率:(p*(n+1)/2) +n*(1-p) )
渐进符号的含义
O(读作“O”) 算法最坏情况的度量
Ω (读作“omega”) 算法最好情况下的度量
Θ (读作“theta”) 算法效率的区间,不是最好也不是最坏
汉诺塔问题
在A中有n个盘子,把n个盘子移动到C中:
- 把 n-1 个盘子移动到B中,再把第 n 个移动到C中;
- 把 n-2 个盘子移动到A中,再把第 n-1 个移动到C中;
- 类推;
斐波那契数问题
设f(1) = 1,f(2) = 1;
则 f(n) = f(n-1) + f(n-2);
第3章 蛮力法
选择排序
算法思想:选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
冒泡排序
依次相邻两个比较,直到有序。
字符串匹配问题
给定一个n个字符组成的串(文本),一个m个字符的串(模式),从文本中寻找匹配模式的子串。
蛮力字符串匹配: 将模式对准文本的前m个字符,然后从左到右匹配每一对相应的字符,直到m对字符全部匹配,则成功匹配;如果遇到一对不匹配的字符,然后模式右移一位,然后从模式的第一个字符开始,继续匹配。
百钱买百鸡
百钱百鸡问题。中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?
算法2如下:
main( )
{
int x,y,z;
for(x=1;x<=20;x=x+1)
for(y=1;y<=33;y=y+1)
{
z=100-x-y;
if(z mod 3==0 and 5*x+3*y+z/3==100)
{
print(the cock number is",x)
print(the hen number is", y);
print(the chick number is "z);
}
}
}
算法分析:以上算法只需要枚举尝试2033=660次。实现时约束条件又限定Z能被3整除时,才会判断“5x+3*y+z/3=100”。这样省去了z不整除3时的算术计算和条件判断,进一步提高了算法的效率。
DFS和BFS
DFS: 二叉树的前中后序遍历
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0;
return Math.max(maxDepth(root