数组
1.读取元素 使用下标直接读取 (通过下标读取元素的方式叫做随机读取)
2.更新元素 使用下标直接赋值
二者的时间复杂度都是O(1)
3.插入元素
尾部插入 等同于更新元素
中间插入 从后向前遍历,将后面的元素依次向后移动,再向目标位置插入更新
超范围插入 由于数组定长,需要重新创建一个数组,将原数组平移过来,再进行插入操作
对于插入操作而言,数组扩容的时间复杂度是O(n),插入并移动元素的时间复杂度也是O(n),所以综合起来的时间复杂度是O(n)
4.删除元素
从删除位的后面一位开始,向数组末端循环,依次将元素前移
删除操作只涉及元素的移动,时间复杂度也是O(n)
对删除操作而言,当数组元素没有顺序要求时,可以取巧,将删除目标位置的元素与最后一位调换,再移除最后一位元素,此时时间复杂度是O(1)。本方法只做参考,并不是删除元素时主流的操作方式。
数组具有非常高效的随机访问能力,只要给出下标,就可以用常量时间找到对应元素。
有一种高效查找元素的算法叫作二分查找,就是利用了数组的这个优势。
数组的劣势体现在插入和删除方面,由于数组元素连续紧密地存储在内存中,插入、删除元素都会导致大量元素被迫移动,影响效率。
总的来说,数组适合“读操作多,写操作少”的场景
==留坑
链表
物理结构-逻辑结构
栈和队列
散列表-哈希表-字典
---
树
二叉树
满二叉树
完全二叉树 指的是结点位置,而非存在结点位置上的值
二叉查找树(二叉排序树)
深度优先遍历(前中后序) (递归实现、栈实现)
广度优先遍历 (层序) (队列实现)
二叉堆(本质上是完全二叉树,又细分为最大堆和最小堆)(优先队列)
==
排序算法
时间复杂度为O(n^2)的:冒泡,选择,插入
介于O(n^2)和O(nlogn)之间的: 希尔排序
O(nlogn)的:快速排序,归并排序,堆排序
时间复杂度为线性的排序:计数排序,桶排序,基数排序
本书仅讲述:冒泡排序,快速排序,堆排序,计数排序,桶排序
冒泡排序
快速排序(分治法)
==
面试算法
判断链表有环
最小栈的实现
最大公约数
如何判断一个数是否为2的整数次幂
无序数组排序后的最大相邻差
用栈来实现队列(均摊时间复杂度)
寻找全排列的下一个数
删去k个数字后的最小值(贪心算法,栈优化)
如何实现大整数相加(计数排序,栈优化)
金矿问题(动态规划)
寻找缺失整数(求和做差、异或运算)
Bitmap
LRU 最近最少使用
A星寻路算法
红包分发