常用的数据结构和技巧
1.1数组、字符串
【0 1 2 3 4 5 6 7 8 9】
a[1] a[6]
优点:构建一个数组非常简单/能让我们在O(1)的时间里面根据数组的下标(index)查询某个元素。
缺点:构建时必须分配一段连续的空间。/查询某个元素是否存在时需要遍历整个数组,耗时O(n)的时间(其中,n是元素的个数),删除和添加某个元素时,同样需要耗费O(n)的时间。
1.2链表
优点:灵活的分配内存空间/能在O(1)时间内删除或者添加元素。
缺点:查询元素时候需要O(n)时间。
解题技巧:利用快慢指针(有时候要用到三个指针)/构建一个虚假的链表
习题
1.定义三个指针prev,curr,next分别代表前一个节点、当前节点、下一个节点
实现代码如下:
1.3栈
特点:先进后出
算法基本思想:可以用一个简单的链表来实现
只关心上一次的操作,处理完上一次的操作后能在O(1)的时间内找出更上一次的操作。
例题1:
通过进栈和出栈的方式查找出相同的组合,若前两个相同第三个不相同则栈内弹出第三个元素即可查找出相同的组合。
1.4队列
特点:先进先出。
应用场景:广度的优先搜索。
1.4.1双端队列
可以利用一个双链表。
算法的头尾两端能在O(1)时间内删除、查看和添加。
习题:
解题思路:先指向第一个数1,放在队首;扫描下一个数3,3>1所以1被弹出,3位于榜首;接着指向第三个数-1<3,所以-1在队列的后面如下面所示。所以找出第一个最大值是3。以此类推继续找出接下来的每三个数中的最大值。最终结果是3,3,5,5,6,7