剑指Offer_解题记录
- 📝分享和记录做题的思路
- 🧑🏻💻本篇包含部分数据结构的基础笔记
- 🦾希望我的代码可以帮到看这篇题解的人
Commonly Used Class
1 | //Definition of a single-linked list node |
Commonly Used Data Structures
HashSet
1 | // HashSet最重要的特性就是:不接受重复的元素,两个元素的比较不是用==而是用equals方法,也就是说Set不接受两个对象 |
String
1 | // 总结String常用的方法 |
Tree
介绍
树🌲是一种数据结构,用来模拟具有树状结构性质的数据合集。树的每一个节点都有一个值
和一个包含所有子节点的列表
,树也可以视为一个拥有N个
节点和N-1
条边的有向无环图。
二叉树
是一种更为典型的树状结构。如它名字所描述的那样,二叉树是每个节点最多有两个子树
的树结构,通常子树被称作“左子树”和“右子树”。
树有4⃣️种遍历方法:
- 前序遍历特点: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序
- 中序遍历特点: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序
- 后序遍历特点: 节点按照 [ 左子树 | 右子树 | 跟节点 ] 排序
- 层序遍历
- 先序遍历
- 判空
- 访问节点
- 左孩子入栈(再次从 1 开始执行)
- 右孩子入栈(再次从 1 开始执行)
- 中序遍历
- 判空
- 左孩子入栈
- 访问节点
- 右孩子入栈
- 后序遍历
- 判空
- 左孩子入栈
- 右孩子入栈
- 访问节点
- 遍历分为两种解法 -
递归和迭代
前序遍历
1 | class Solution_144_0{ |
中序遍历
1 | class Solution_94_0{ |
后序遍历
1 | class Solution_145_0{ |
层序遍历
1 | public List<List<Integer>> levelOrder(TreeNode root) { |
1 | //前序遍历特点: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序 |
Tree
07-重建二叉树
1 | //根据给出的树的前序遍历和中序遍历重构树结构 |
26-树的子结构
1 | class Solution_26_0{ |
27-二叉树的镜像
1 | class Solution_27_0{ |
32-1 -从上往下打印二叉树
1 | class Solution_32_1_0{ |
32-2 -从上往下打印二叉树 2
1 | public List<List<Integer>> levelOrder(TreeNode root) { |
32-3 -从上往下打印二叉树 3
1 | class Solution_32_3_0{ |
33-二叉搜索树的后序遍历序列
1 | class Solution_33_0{ |
34-二叉树中和为某一值的路径
1 | class Solution_34_0{ |
36-二叉搜索树与双向链表
1 | class Solution_36_0{ |
55-1-二叉树的深度
1 | class Solution_55_1_0{ |
55-2-平衡二叉树
1 | class Solution_55_2_0{ |
28-对称的二叉树
1 | class Solution_28_0{ |
(困难)37-序列化二叉树
1 | class Solution_37_0{ |
54-二叉搜索树的第k大节点
1 | class Solution_54_0{ |
LinkedList
06-从尾到头打印链表
1 | import java.util.ArrayList; |
22-链表中倒数第k个结点
1 | import java.util.ArrayList; |
24-反转链表
1 | import java.util.ArrayList; |
25-合并两个排序的链表
1 | public class mergeTwoLists_25 { |
35-复杂链表的复制
1 | import java.util.HashMap; |
52-两个链表的第一个公共节点
1 | public class getIntersectionNode_52 { |
18-删除链表的节点
1 | public class deleteNode_18 { |
Stack & Queue
09-用两个栈实现队列
1 | import java.util.LinkedList; |
30-包含min函数的栈
1 | import java.util.Stack; |
31-栈的压入、弹出序列
1 | import java.util.Stack; |
58-1-翻转单词顺序
1 | public class reverseWords_58_1 { |
59 - I. 滑动窗口的最大值
1 | import java.util.Deque; |
Heap
40-最小的K个数
1 | import java.util.Comparator; |
Hash Table
50-第一个只出现一次的字符
1 | public char firstUniqChar(String s) { |
Graph (DFS & BFS)
12-矩阵中的路径(DFS)
1 | class Solution_12_0{ |
13-机器人的运动范围(DFS)
1 | class Solution_13_0{ |
Fibonacci (Dynamic Programming)
10-1-斐波拉契数列
1 | public class Fib_10_1 { |
10-2-青蛙跳台阶问题
1 | public class numWays_10_2 { |
Searching Algorithms (Binary Search)
04-二维数组中的查找
1 | import java.util.Arrays; |
11-旋转数组的最小数字(二分查找)
1 | import java.util.Arrays; |
56-1-数组中数字出现的次数
1 | public class singleNumbers_56_1 { |
Permutation
38-字符串的排列
1 | class Solution { |
Dynamic Programming
42-连续子数组的最大和
1 | class Solution { |
19-正则表达式匹配
1 |
Bitwise Operation
15-二进制中1的个数
1 | class Solution_15_0{ |
16-数值的整数次方
1 | class Solution_16_0{ |
Other Algorithms
05-替换空格
1 | class Solution_05_0{ |
21-调整数组顺序使奇数位于偶数前面
1 | class Soulution_21_0{ |
39-数组中出现次数超过一半的数字
1 | class Solution_39_0{ |
43-1~n整数中1出现的次数(妖魔算法题)
1 | public class countDigitOne_43 { |
45-把数组排成最小的数(妖魔算法题)
1 | class Solution_45_0{ |
49-丑数 (妖魔算法题)
1 | class Solution_49_0{ |
57-2-和为S的连续正数序列(滑动窗口思想)
1 | public class findContinuousSequence_57_2 { |
57-和为S的两个数字(双指针思想)
1 | public class twoSum_57 { |
58-2-左旋转字符串(矩阵翻转)
1 | class Solution_58_2_0{ |
62-圆圈中最后剩下的数(约瑟夫环)
1 | class Solution_62_0{ |
66-构建乘积数组
1 | class Solution_66_0{ |