- 常用数据结构和技巧
-
数组、字符串
数组优点:构建简单,按下标查找快。
缺点:需连续分配存储空间,查询某元素是否存在要遍历整个数组,添加删除也是。 -
链表
链表优点:灵活分配空间,快速添加删除
缺点:查询慢。
技巧:快慢指针;构建一个虚假链表头
【例】k个一组翻转链表
若链表长度小于k,返回原链表
用三个指针prev、cur、next,将cur下一个节点保存到next指针,然后cur指针指向prev,然后cur和prev一起前进一步。不断重复以上步骤直到完毕。 -
栈
特点:后进先出。
思想:可以用一个单链表来实现;只关心上一次操作;处理完上一次操作后,能在O(1)内查找到更前一次操作。
【例】有效括号
用一个栈,往里面压左括号,一旦遇上一个右括号,就把栈顶的左括号弹出来,说明合法,直到最后,来判断栈里还有没有左括号。
【例】每日温度
把第一天的压入栈,第二天比第一天高,则第一天出栈,得到只需要一天,再第二天入栈。。。若后一天比前一天低,就压入栈,若比前一天高,就出栈。 -
队列
先进先出。
运用双链表。 -
双端队列
队列头尾都能在O(1)内查看、添加、删除数据。常用:实现一个长度动态变化的窗口。
【例】滑动最大窗口
利用双端队列,保存当前窗口中最大的数的下标,新的头总是当前窗口最大的数,若新的队列已经不包含原来最大的数,就把旧的数从队头删除。 -
树
一般考察递归算法。
普通/平衡/完全二叉树、二叉搜索树、多叉树
前序/中序/后序遍历的递归/非递归写法
【例】二叉搜索中第k小的元素
对树进行中序遍历,当访问到第k个元素,返回结果
-