目录
基本概念
查找
顺序查找、二分查找、哈希表查找和二叉排序树查找
排序
插入排序、冒泡排序、归并排序、快速排序
比较优缺点:额外空间消耗、平均时间复杂度和最差时间复杂度
快速排序 :先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边。
例题
二分查找
面试题11“旋转数组的最小数字”
顺序查找 是最简单的办法,
O
(
n
)
O(n)
O(n),但还能提升。
类似于 二分查找,如果中间那个数比开头小,说面前半段有最小值;如果中间那个数比结尾大,说明后半段有最小值;剩下情况就需要顺序查找了。
面试题53-I“在排序数组中查找数字I”
因为是 排序树组 ,因此会自然想到用 二分查找 来解决问题。
这个题中使用二分法找到这个数字第一次出现的位置和最后一次出现的位置,就能得到出现的次数了。
面试题53-II“0~n-1中缺失的数字”
有两种方法:
- 直接求出0~n-1的和,然后减去数组里所有数字的和,就知道谁不在了
- 考虑到这是 递增排序 的数组,上面方法并没用到这个信息,那么如果有了这个信息,我们就能用 二分查找 来解决问题。判断当前值是否等于下标即可,如果相等则找右半边;如果不等且前一个等于下标,那这就是要找的数字了;如果前一个也不等,那就找左半边。
二叉搜索树
面试题33“二叉搜索树的后序遍历序列”
这个题主要把握二叉搜索树的特点就可以了, 左子节点总是小于或等于根节点,而右子节点总是大于或等于根节点 。利用递归方法,遍历序列,找到满足条件的左右子树之后递归调用函数,判断左右子树分别是不是二叉搜索树,如果不是就返回False即可。
面试题36“二叉搜索树与双向链表”
这题基本思路很简单,但实现感觉逻辑上还是有点复杂呀。。
就是一个中序遍历,递归实现就可以了。每一次把 前后 两个节点的左右互连起来就好了。需要用两个额外的指针变量来保存。
这两天头脑不清楚,还是看了答案做的,所以把代码贴出来,感觉这种做法至少我一下子不能想的很清楚。
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
def dfs(cur):
if not cur: return
dfs(cur.left) # 递归左子树
if self.pre: # 修改节点引用
self.pre.right, cur.left = cur, self.pre
else: # 记录头节点
self.head = cur
self.pre = cur # 保存 cur
dfs(cur.right) # 递归右子树
if not root: return
self.pre = None
dfs(root)
self.head.left, self.pre.right = self.pre, self.head
return self.head