算法刷题
在刷题的过程中,整理和分类算法相关题目。
栈
-
剑指 Offer 30. 包含min函数的栈
思想:维护一个递减的栈来实现min方法 -
剑指 Offer 59 - II. 队列的最大值
这里使用的思想与上一题相同,但区别在于本题需要维护的是一个双向队列Deque,与Queue的区别是,它可以从两端删除或增加元素!
这个双向队列Deque是从头向尾递减的,所以要注意从尾部开始比较!!!
关于双向队列的知识,可以参考Java中的queue和deque对比详解
堆
- 剑指 Offer 40. 最小的k个数
使用PriorityQueue
对象实现移动窗,PriorityQueue
的顶端是最小值。不同于先进先出的队列,优先级队列(PriorityQueue
)的话,是按照对象给定的优先级来进行出入的处理,默认是从小到大 - 剑指 Offer 41. 数据流中的中位数
利用一个大顶堆,一个小顶堆来实现。一个小顶堆用来做前半部分排序,大顶堆用来做后半部分排序。
排序
- 剑指 Offer 45. 把数组排成最小的数
转化为比较拼接字符串后的大小
树
-
剑指 Offer 26. 树的子结构
使用两个递归,一个递归用来判断当前节点是否子结构,另一个用来判断其左右节点作为根节点是否是子结构 -
剑指 Offer 27. 二叉树的镜像
递归思想 -
剑指 Offer 28. 对称的二叉树
递归思想 -
剑指 Offer 32 - I. 从上到下打印二叉树
递归无法解决,利用队列来保存当前层的节点 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
同样适用队列的思想来解决 -
剑指 Offer 55 - II. 平衡二叉树
与上一题思想类似 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
递归,要注意返回值!
队列
- 剑指 Offer 59 - I. 滑动窗口的最大值
利用PriorityQueue排序
数组
-
剑指 Offer 53 - I. 在排序数组中查找数字 I
利用两次二分查找找到左右边界
Hash表
-
剑指 Offer 48. 最长不含重复字符的子字符串
使用双指针+Hash表 -
剑指 Offer 50. 第一个只出现一次的字符
使用Hash表
链表
-
剑指 Offer 22. 链表中倒数第k个节点
使用双指针的方法来解决,就不用遍历整个链表了。 -
剑指 Offer 24. 反转链表
递归思想,但是要注意从后往前反转 -
剑指 Offer 35. 复杂链表的复制
使用Hash表来完成深拷贝 -
剑指 Offer 52. 两个链表的第一个公共节点
規律:a+c+b = b+c+a
字符串
-
剑指 Offer 58 - I. 翻转单词顺序
注意这里题目的要求,反转后首位不能有空格,中间空格不能超过一个 -
剑指 Offer 58 - II. 左旋转字符串
利用substring -
剑指 Offer 67. 把字符串转换成整数
关键是对越界的数值处理