
剑指offer
小镇攻城狮
吃饭的家伙要拿稳咯
展开
-
剑指offer题目索引
数据结构 链表 JZ3 从尾到头打印链表 JZ14 链表中倒数第k个结点 JZ15 反转链表 JZ16 合并两个有序的链表 数组 JZ1 二维数组查找一个特定值 JZ6 旋转数组后的最小数字 JZ7 斐波那契数列 JZ13 调整数组顺序使数组中的奇数位于偶数前面 二叉树 JZ4 根据前序遍历和中序遍历重建二叉树 JZ17 判断是否是子树 栈 JZ5 用两个栈实现队列 位运算 JZ11 二进制中1的个数 数学运算 JZ12 数值的整数次方 字符串 JZ2 替换空格 递归 JZ8 跳台阶 JZ9 变态跳台阶 J原创 2021-03-19 21:16:20 · 198 阅读 · 0 评论 -
【剑指 Offer】68. 二叉树的最近公共祖先
1 二叉搜索树的最近公共祖先 解析 若 root 是 p,q 的 最近公共祖先 ,则只可能为以下三种情况之一: p 和 q 在 root 的子树中,且分列 root 的 异侧(即分别在左、右子树中); p=root 且 q 在 root 的左或右子树中; q=root 且 p 在root 的左或右子树中; 参考代码(Java) public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // 最近公共祖原创 2021-06-01 20:09:40 · 1656 阅读 · 0 评论 -
【剑指 Offer】37. 序列化二叉树
原题链接 解析 通常使用的前序、中序、后序、层序遍历记录的二叉树的信息不完整,即唯一的输出序列可能对应着多种二叉树可能性。 题目要求的 序列化 和 反序列化 是 可逆操作 。因此,序列化的字符串应携带 完整的二叉树信息 。 参考代码(Java先序遍历) class Codec { // Encodes a tree to a single string. public String serialize(TreeNode root) { if (root == null)原创 2021-06-01 11:36:40 · 2234 阅读 · 0 评论 -
【剑指 Offer】32. 从上到下打印二叉树(BFS)
一共三道题,分别以不同的方式对二叉树进行BFS的遍历。 BFS 通常借助队列的先入先出特性来实现。 1 原题链接 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 public int[] levelOrder(TreeNode root) { if (root == null) return new int[]{}; List<Integer> list = new ArrayList<>();原创 2021-05-31 22:15:22 · 2275 阅读 · 0 评论 -
【剑指 Offer】59 - II. 队列的最大值
原题链接 解析 定义一个队列,一个双向队列。 队列存储原来的元素; 双向队列存储局部最大值 参考代码(Java) class MaxQueue { Queue<Integer> q1; Deque<Integer> q2; public MaxQueue() { q1 = new LinkedList<>(); q2 = new LinkedList<>(); } public in原创 2021-05-08 14:59:25 · 787 阅读 · 0 评论 -
【剑指 Offer】30. 包含 min 函数的栈
原题链接 解析 定义两个栈,一个存储原来的元素,一个存储最小的元素 参考代码(Java) class MinStack { Stack<Integer> s1, s2; public MinStack() { s1 = new Stack<>(); s2 = new Stack<>(); } public void push(int x) { s1.push(x); i原创 2021-05-08 14:52:05 · 1151 阅读 · 0 评论 -
【剑指 Offer】09. 用两个栈实现队列
原题链接 解析 定义两个栈,经过两个栈的 入栈和出栈 ,实现队列 先进先出 的特点 参考代码(Java) class CQueue { Stack<Integer> s1; Stack<Integer> s2; public CQueue() { s1 = new Stack<>(); s2 = new Stack<>(); } public void appendTail(int原创 2021-05-08 14:44:24 · 1063 阅读 · 0 评论 -
【剑指 Offer】59 - I. 滑动窗口的最大值
原题链接 解析 使用暴力解法会超时; 创建一个 非严格单调递减 的双端队列,存储窗口中的值,将计算窗口的最大元素的时间复杂度将为O(1) 参考代码 public int[] maxSlidingWindow(int[] nums, int k) { if (nums.length == 0 || k == 0) return new int[0]; Deque<Integer> deque = new LinkedList<>(); int[原创 2021-05-08 11:25:03 · 1142 阅读 · 0 评论 -
【剑指 Offer】35. 复杂链表的复制
原题链接 解析 可以使用 哈希表 存储链表的结构 参考代码(Java) public Node copyRandomList(Node head) { if (head == null) return null; Node cur = head; Map<Node, Node> map = new HashMap<>(); // 1. 复制各节点,并建立 “原节点 -> 新节点” 的 Map 映射 while (cur原创 2021-05-08 11:16:23 · 1078 阅读 · 0 评论