常用数据结构的使用技巧

常用数据结构的使用技巧

  • 数组,字符串/Array&String
  • 链表/Linked-list
  • 栈/Stack
  • 队列/Queue
  • 双端队列/Deque
  • 树/Tree

1. 数组,字符串

很多时候需要对字符串中的每一个字符进行处理,有时候会先将其转为字符数组。

举个简单的例子,假设需要翻转一个字符串,可以使用两个指针,一个指向第一个字符,一个指向最后一个字符,然后进行交换,交换完成后两个指针向中央一步一步靠拢并进行交换,直到两个指针相遇。因为无法修改字符串中的字符,所以需要先将其转为字符数组。

数组的优点:

  • 构建一个数组很简单
  • 能让我们在O(1)的时间里根据数组的下标(index)查询某个元素

数组的缺点:

  • 构建时必须分配一段连续的空间
  • 查询某个元素是否存在需要遍历整个数组,耗费O(n)的时间
  • 删除和添加某个元素时,同样需要耗费O(n)的时间

经典题目:力扣第242题(有效的字母异位词)

2. 链表

链表是为了弥补数组的缺陷,即分配数组的时候需要开辟一段连续的内存空间,但也牺牲了一些数组的优点,如链表不能通过下标快速的查询,所以在考虑是否使用链表时,先考虑算法是否要经常进行查询。

链表的优点:

  • 灵活地分配内存空间
  • 能在O(1)时间内删除或者添加元素

链表的缺点:

  • 查询元素需要O(n)时间

链表的经典解题技巧:

  • 利用快慢指针,有时需要用到三个指针(例如链表的翻转,寻找倒数第k个元素,寻找链表中中间位置的元素,判断链表是否有环等)
  • 构建一个虚假的链表头(一般用在需要返回新的链表的题目中,例如两个排序链表进行整合排序或者将链表奇偶数分离,生成前半部分奇数后半部分偶数的链表)

建议在解决链表的题目时在纸上或者白板上画出节点之间的相互关系,画出修改的方法。
经典题目:力扣第25题(K个一组翻转链表)

3. 栈

栈的最大特点就是后进先出,所有操作(查询,压入数据,弹出数据)都是在栈的顶部完成的,因此可以使用一个单链表来实现栈的数据结构,由于只针对栈顶元素,所以借用单链表的头就可以让所有栈的操作在O(1)时间内完成。

一般情况下如果只关心上一次的操作或者处理完上一次操作后,能在O(1)时间内查找到更前一次的操作,这个时候就可以使用栈。

经典题目:力扣第20题(有效的括号),力扣第739题(每日温度)

4. 队列

队列的最大特点就是先进先出,只允许在队尾查看和添加数据,在队头查看和删除数据。可以借助双链表实现队列,双链表头指针允许在队头查询和删除数据,双链表尾指针允许在队尾查询和添加数据。

一般如果我们需要按照一定的顺序来处理数据,且要处理的数据在不断变化时使用队列,在算法中最常用的场景就是广度优先搜索

5. 双端队列

双端队列与队列相比,可以在队列的头尾两端进行数据的查看,添加,删除。可以同样借助双链表实现。

双端队列最常用的地方就是实现一个长度动态变化的窗口或者连续区间。

经典题目:力扣第239题(滑动窗口最大值)

6. 树

树的结构直观,主要考察的就是递归算法。

常见的树的形状:

  • 普通二叉树
  • 平衡二叉树
  • 完全二叉树
  • 二叉搜索树
  • 四叉树
  • 多叉树

特殊的树:红黑树,自平衡二叉搜索树

树的遍历:

  • 前序遍历(Preorder Traversal),用的最多的场合包括在树里进行搜索以及创建一棵新的树
  • 中序遍历(Inorder Traversal),用的最多的场合就是二叉搜索树
  • 后序遍历(Postorder Traversal),当分析一个节点时,需要利用左子树和右子树的信息时用

经典题目:力扣第230题(二叉搜索中第K小的元素)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值