leetcode按题型刷
1. 时间复杂度与空间复杂度
1.1 时间复杂度
- 执行时间与输入值(问题规模)之间关系
- 问题规模, 与变量有关
- 几个常见时间复杂度
O(1)
O(logn)
O(n)
O(m+n)
O(nlogn)
O(n*n)
时间复杂度对比
1.2 空间复杂度
- 存储空间与输入值之间关系
- 常见的就是O(1)和O(n)
- 如何分辨O(1)还是O(n)
- 输入值是否用作常量
- 是否是递归,递归是O(n)
- 如何分辨O(1)还是O(n)
左:O(1) 右:O(n)
1.3 总结
- 时间和空间只能二选一, 时间换空间,空间换时间
- 工作时,一般是考虑时间优先
2.数据结构
2.1 数组Array
-
连续的内存空间,存储一组相同类型数据
-
四种方法的时间复杂度
- 访问 O(1) : 通过索引访问元素
- 搜索 O(n) : 遍历元素返回索引位置
- 插入 O(n) : 插入元素位置后所有元素后移, 最坏时间复杂度O(n)
- 删除 O(n) : 同上
-
特点 : 读多写少
-
常见操作:
(1).创建数组
(2). 增删改查(通过索引,遍历查找),
方法 | 时间复杂度 |
---|---|
arr.add(元素) | O(1):arr没满的情况下; O(n):arr满了,重新创建一个新数组,旧的数据都要复制过去 |
arr.add(索引,元素) | O(n) |
arr.remove(索引) | O(n) |
arr.set(索引,元素) | O(1) |
arr.get(索引) | O(1) |
arr.contains(元素) | O(n): 需要通过循环数组进行查询 |
(3).遍历数组,数组长度,数组排序(内置)
方法 | |
---|---|
数组长度 | 1,2,3 : c.length; 4 : arr.size() |
遍历数组 | for循环中:c[i] or arr.get(i) |
排序(升序) | O(nlogn): Array.sort( c); Collection.sort(arr) |
排序(降序) | O(nlogn): Array.sort( c(转为Integer类型),Collection.reverseOrder()); Collection.sort(arr,Collection.reverseOrder()) |
-
练习题
-
485 最大连续1的个数
-
283 移动0
-
27 移除元素