## 复杂度
**复杂度通常包括时间复杂度与空间复杂度**
**复杂度的计算**:
它与具体的常系数无关,O(n)和O(2n)表示同样同样的复杂度。
复杂度相加的时候,选择高者作为结果,也就是O(n*n)+O(n) 与O(n*n)表示相同的复杂度。
O(1)也是表示一个特殊的复杂度,即任务与算例个数n无关。
**时间复杂度**与代码的结构设计高度相关。
**空间复杂度**与代码中数据结构的选择高度相关。
## 时间变空间
**将“昂贵”的时间复杂度转换为“廉价”的空间复杂度。**
假定在不限时间、也不限空间的情况下,可以完成某个任务的代码的开发
这就是通常说的暴力解法,更是程序优化的起点。
在程序开发中,连接时间和空间的桥梁就是**数据结构**。
对于一个开发任务,如果能找到一种高效的数据组织方式,**采用合理的数据结构**,
就可以实现时间复杂度的再次降低,这通常会**增加数据的存储量**,也就是**增加了空间复杂度。**
**程序优化最核心的思路:**
第一步,暴力解法:
在没有任何时间、空间约束下,完成代码任务的开发。
第二步,无效操作处理:
将代码中的无效计算、无效存储剔除,降低时间或空间复杂度。
第三步,时空转换:
设计合理数据结构,完成时间复杂度向空间复杂度的转移。
**降低复杂度的案例:**
1)有任意多张面额为2元、3元、7元的货币,现要用他们凑出100元,求总共有多少总可能?
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200704085736176.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0OTY5NjQz,size_16,color_FFFFFF,t_70)
2)求一个输入数组中,查找出现次数最多的元素?
解法一:时间复杂度为O(n*n)
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200704085842829.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0OTY5NjQz,size_16,color_FFFFFF,t_70)
解法二:利用数据结构,空间换时间,O(n)
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200704085910392.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0OTY5NjQz,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200704085926758.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0OTY5NjQz,size_16,color_FFFFFF,t_70)