常用数据结构和技巧

常用的数据结构有:

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

数组、字符串

字符串中的字符无法修改。

数组的优点:
构建一个数组非常简单
能在O(1)的时间里根据数组的下标(index)查询某个元素

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

链表

链表的出现在某种程度上是为了避免数组的一大缺陷——创建数组时需要开辟一段连续的数组空间。但也牺牲了数组的一些优点——链表不能通过下标快速查询。所以在考虑是否需要用链表时,需要想清楚,是否需要经常查进行询和遍历。
单链表:
链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。
双链表:
与单链表不同的是,双链表的每个结点中都含有两个引用字段。

链表的优点:
灵活地分配内存空间
能在O(1)时间内删除或者添加元素
链表的缺点:
查询元素需要O(n)时间

解题技巧:
利用快慢指针(有时候需要用到三个指针)
构建一个虚假的链表头

例如:
两个排序链表,进行整合排序
将链表的奇偶数按原定顺序分离,生成前半部分为奇数,后半部分为偶数的链表。在这类问题里,如果不用虚假的链表头,那么在创建新列表的第一个元素时,我们都得判断链表的头指针是否为空,也就是要多写一条if…else…语句。比较简单的写法是创建一个空的链表头,直接往其后面添加元素即可,最后返回该空的链表头的下一个结点即可。

如何训练该技巧
在纸上或者白板上画出结点之间的相互关系
画出修改的方法,而且在面试时,将方法画在纸上,还能让面试官清楚地看到思路。

栈的最大特点:
后进先出(LIFO)

算法基本思想:
可以用一个单链表来实现
只关心上一次的操作
处理完上一次的操作后,能在O(1)时间内查找到更前一次的操作

队列

队列的最大特点:
先进先出(FIFO)

对于队列来说,只允许在队尾查看和添加数据,在队头查看和删除数据。
可以借助双链表实现队列。

需要用到队列解题的情况:
需要按照一定的顺序处理数据,而要处理的数据在不断地变化。

常用的场景:
广度优先搜索

双端队列

基本实现:
可以利用一个双链表
队列的头尾两端能在O(1)的时间内进行数据的查看、添加和删除

常用的场景:
实现一个长度动态变化的窗口或者连续区间

树最应该花时间去学习
树的共性:
结构直观
通过树问题来考察递归算法掌握的熟练程度

面试中常考的树的形状有:
普通二叉树
平衡二叉树
完全二叉树
二叉搜索树
四叉树
多叉树
特殊的树:红黑树、自平衡二叉搜索树

遍历:
前序遍历(Preorder Traversal)
中序遍历(Inorder Traversal)
后序遍历(Postorder Traversal)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值