图解剑指offer_记录
摘自图解剑指offer
Take^that
可控的事情要谨慎,不可控的事情要乐观。
展开
-
剑指offer_3 -- 构建乘积数组
1.题目要求 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。 2.题目思路 对于这道题,要求对于一个数组,返回除了该位之外的所有的累加乘积。 对于这种需要遍历整个数组并返回除了自己之外的计算结果的题目,我们可以利用从前往后、从后往前的策略,来对整个数组实现遍历并计算乘...转载 2019-06-26 22:50:10 · 123 阅读 · 0 评论 -
图解剑指offer 23 跳台阶 + 变态跳台阶
一、题目 二、大致思路 三、代码实现 public int jumpFloor(int n){ if(n <= 2){ return n; } int pre2 = 1, pre1 = 2; int result = 1; for (int i = 2; i < n; i++) ...转载 2019-08-08 10:15:31 · 146 阅读 · 0 评论 -
剑指offer_17 二叉搜索树的第k个节点
一、题目描述 给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 二、思路 :利用二叉查找树中序遍历有序的特点 三、代码实现 private TreeNode ret; private int cnt = 0; public TreeNode KthNode(TreeNode pRoot, int k){...转载 2019-08-02 09:14:37 · 119 阅读 · 0 评论 -
剑指offer 25 矩形覆盖
一、题目 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 二、大致思路 思路: 【1】根据前几项1,2,3,5,8,13,……推出公式:f(n)=f(n-1)+f(n-2),n>=3 ; f(n)=n,n<3 【2】画图推导公式 当n>=3时,2n 由 2(n-1) 和 2*(n-2) 两种情况构成,...转载 2019-08-09 09:31:01 · 80 阅读 · 0 评论 -
图解剑指offer_27 数值的整数次方
代码实现: public double Power(double base, int exponent){ if(exponent == 0){ return 1; } if(exponent == 1){ return base; } boolean isNeg...转载 2019-08-13 21:55:30 · 102 阅读 · 0 评论 -
剑指offer_33 二叉树的镜像
一、题目 操作给定的二叉树,将其变成为源二叉树的镜像。 输入描述: 源二叉树: 8/ 6 10/ / 5 7 9 11 镜像二叉树: 8 /10 6/ / 11 9 7 5 二、大致思路 先交换根节点的两个子节点,之后,再分别交换这两个节点的左右子节点 三、代码实现 public void Mirror(TreeNode root){ if(root == ...转载 2019-08-19 09:24:03 · 79 阅读 · 0 评论 -
图解剑指offer_28 调整数组使奇数位于偶数前面
一、题目 二、大致思路 遍历数组,奇数前插入,偶数后插入 三、代码实现 public void reOrderArray(int[] nums){ //奇数个数 int oddCnt = 0; for (int val : nums) { if(val % 2 == 1){ oddCnt ++...转载 2019-08-14 09:31:41 · 80 阅读 · 0 评论 -
剑指offer 20 滑动窗口的最大值
一、题目 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 二、大致思路 维护一个大小为size的大顶堆 三、代码实现 注:代码来自 <图解剑指offer> 第20题 /* 针对数组{2,3,4,2,6,2,5,1}的滑动...转载 2019-08-07 15:30:01 · 72 阅读 · 0 评论 -
剑指offer_29 链表中倒数第k个结点
一、题目 输入一个链表,输出该链表中倒数第k个结点。 二、大致思路 三、代码实现 public ListNode FindKthToTail(ListNode head, int k){ if(head == null){ return null; } ListNode p1 = head; while(p1...转载 2019-08-15 09:54:17 · 63 阅读 · 0 评论 -
剑指offer_34 顺时针打印矩阵
一、题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵: 1, 2, 3, 4 5, 6, 7, 8 9, 10,11,12 13,14,15,16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 二、大致思路 将结果存入数组中,先从左到右,再从上到下,再从右到左,最后从下到上遍历。 三、代码实现 public...转载 2019-08-24 23:08:53 · 99 阅读 · 0 评论 -
剑指offer_30 反转链表
一、题目 输入一个链表,反转链表后,输出与新链表的表头。 二、代码实现 1.理解递归: 上图中递归代码: public ListNode ReverseList(ListNode head){ if(head == null || head.next == null){ return head; } ListNode nex...转载 2019-08-16 09:25:17 · 94 阅读 · 0 评论 -
图解剑指offer_31 合并两个排序的链表
一、题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 二、代码实现 1.理解递归: 合并过程中,首先比较两个链表的首节点哪个小,较小的节点作为合成链表的首节点,之后将指针指向较小节点的后一个节点,再次进行上面逻辑的比较,可以发现比较过程是一个递归的操作。 上图中代码实现: public ListNode Merge(ListNode p1, Li...转载 2019-08-16 09:40:01 · 76 阅读 · 0 评论 -
图解剑指offer_26 二进制中1的个数
一、题目 请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数。 二、大致思路 n & (n - 1) 每次计算都会消除最后一位1。用这样来计算就可以确定有多少个1. n : 10110100 n - 1 : 10110011 n&(n-1) : 10110000 时间复杂度:O(M),其中M表示1的个数 三、代码实现 public...转载 2019-08-12 16:13:03 · 105 阅读 · 0 评论 -
图解剑指offer_32 树的子结构
一、题目 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 二、大致思路 先说下算法实现思路:对于两棵二叉树来说,要判断B是不是A的子结构,首先第一步在树A中查找与B根节点的值一样的节点。 通常对于查找树中某一个节点,我们都是采用递归的方法来遍历整棵树。 第二步就是判断树A中以R为根节点的子树是不是和树B具有相同的结构。 这里同样利用到了递归的方法,如果节...转载 2019-08-16 10:30:39 · 87 阅读 · 0 评论 -
剑指offer 35 包含Min函数的栈
1.题目 定义一个栈的数据结构,要求添加一个min函数,使他能够找到栈的最小元素。 2.大致思路 使用两个stack,一个为数据栈,另一个为辅助栈。数据栈用于存储所有数据,辅助栈用于存储最小值。 3.代码实现 private Stack<Integer> dataStack = new Stack<>(); private Stack<Integer> ...转载 2019-08-31 23:36:28 · 69 阅读 · 0 评论 -
剑指offer36——栈的压入、弹出序列
一、题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 二、大致思路 思路:借用一个额外的辅助栈 举例: 入栈1,2,3,4,5 出栈4,5,3,2,1 遍历压栈顺序,先将第一个放...转载 2019-09-01 15:28:32 · 79 阅读 · 0 评论 -
剑指offer_16 序列化二叉树
一、题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。 二、题解 可以根据前序遍历的顺序来序列化二叉树,因为前序遍历序列是从根节点开始的。在遍历二叉树碰到null指针时,这些null指针序列化为一个特殊的字符(如‘#’)。另外,节点的数值之间要用一个特殊字符(如‘,’)隔开。 根据这样的序列化规则,下图中的二叉树被序列化成字符串“1,2,4,#,#,#,3,5,#,#,6,#,#”。 上...转载 2019-07-28 15:37:39 · 90 阅读 · 0 评论 -
图解剑指offer 22 斐波那契数列 动态规划优于递归实现
一、题目 求斐波那契数列的第n项,n <= 39 二、大致思路 三、代码实现 A. B. C.转载 2019-08-08 09:46:41 · 119 阅读 · 0 评论 -
图解剑指 offer 21 旋转数组中的最小数字
原文详见:https://www.cnblogs.com/edisonchou/p/4746561.html 一、题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小...转载 2019-08-08 09:33:30 · 103 阅读 · 0 评论 -
剑指offer_1 二维数组的查找
1.如果在一个二维数组中找到数字7,则返回true,如果没有找到,则返回false。 2.思路 3.java代码实现 public boolean Find(int target, int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { ...转载 2019-06-28 11:05:22 · 109 阅读 · 0 评论 -
剑指offer_5 正则表达式匹配
题目: 请实现一个函数用来匹配包含’.‘和’‘的正则表达式。模式中的字符‘.’表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"及"ab*a"均不匹配。 分析: 这道题的核心其实在于分析’’,对于’.‘来说,它和任意字符都匹配,可把其当做普通字符。对于’'的分...转载 2019-06-29 21:21:03 · 109 阅读 · 0 评论 -
剑指offer_2 数组中重复的数字
一、题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 二、解法 方法一: 要求是时间复杂度O(N),空间复杂度是O(1)。因此不能使用排序的方法,也不能使用额外的标记数组.(...转载 2019-07-16 09:14:00 · 98 阅读 · 0 评论 -
剑指offer_4 替换空格
一、 二、 三、代码实现 public static void ReplaceBlank(char[] target, int maxLength){ if(target == null || maxLength <= 0){ return; } // originalLength 为字符串target的实际长度 ...转载 2019-07-16 09:22:35 · 94 阅读 · 0 评论 -
剑指offer_7 字符流中第一个不重复的字符
一、题目:第一个只出现一次的字符 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’。要求时间复杂度为O(n)。 最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是...转载 2019-07-16 09:30:50 · 121 阅读 · 0 评论 -
剑指offer_8 从尾到头打印链表
一、题目描述 输入一个链表,从尾到头打印链表每个节点的值。 二、题解 方法一: 可以遍历这个链表,遍历过程中用一个ArrayList保存里面的值,然后再从尾到头遍历这个ArrayList,存储在新的ArrayList里面返回。 //使用另外一个ArrayList存储链表的方法 public static ArrayList<Integer> printListFromTai...转载 2019-07-16 10:17:44 · 82 阅读 · 0 评论 -
剑指offer_9 链表中环的入口结点
一、题目描述:一个链表中包含环,请找出该链表的环的入口结点。 二、解析 参见下图 假设相遇于D点,则快指针应该这时刚好套慢指针一圈(2倍速的必然结果,可以数学证明) 则此时快指针走的路程为 ‘AB + BCDEB + BD’ (用BCDEB表示一圈)(字母序表示方向,AB 表示A -> B) 慢指针走的路程为 ‘AB + BD’ 由于S(快指针) = 2 * S(慢指针) (因为2倍速)(...转载 2019-07-16 13:39:48 · 99 阅读 · 0 评论 -
剑指offer_10 删除链表中重复的结点
一、题目描述 Remove all elements from a linked list of integers that have value val. Example: Input: 1->2->6->3->4->5->6, val = 6 Output: 1->2->3->4->5 二、题解 递归 public ListNode...转载 2019-07-16 14:18:35 · 127 阅读 · 0 评论 -
剑指offer_12 查找二叉树的下一个节点
一、题目描述: 给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?数中的节点除了有两个分别指向 左、右节点的指针,还有一个指向父亲节点的指针。 二、题解 我们首先看一棵树: 对于求一棵二叉树中序遍历序列中一个节点的下一个节点一般会有3种情况 第一种情况: 节点有右子树,则下一节点就从它的右子树中查找 如图 第二种情况:没有右子节点,而且它还是其父节点的左子节点。 如图:...转载 2019-07-19 09:46:33 · 143 阅读 · 0 评论 -
剑指offer_13 对称的二叉树
一、题目描述 题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 二.、题解 如上图所示:第一棵二叉树是对称的,剩下两棵都不是对称的。 通常我们有三种不同的二叉树遍历方法:前序遍历、中序遍历以及后续遍历。在这三种遍历算法中,都是先遍历左子节点再遍历右子节点。我们是否可以定义一种遍历算法,先遍历右子节点在遍历左子节点呢?比如我们针对前序遍历定义一种...转载 2019-07-19 09:59:08 · 91 阅读 · 0 评论 -
剑指offer_11 根据先序遍历和后序遍历构建二叉树
一、前序和后序遍历 二、题解 解题思路: 还是可以根据一般的思路,采用递归思想,对于每一个先序序列,划分出对应的根节点、左子树、右子树范围即可自上而下构建出二叉树。 例如对于上例中的先序序列[1,2,4,5,3,6,7],第一个节点一定为根节点,第2到第i个节点为左子树,第i+1到最后一个节点为右子树,那么问题就可以简化为:如何确定左右子树分界点? 对于这个简化过后的问题,从后序遍历序列上很...转载 2019-07-16 21:59:05 · 380 阅读 · 0 评论 -
剑指offer_15 把二叉树打印成多行
一、题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 这道题目与“从上往下打印二叉树”很相似,可以用队列来解决。但是区别在于这道题目需要将每一层进行分行。 二、代码实现 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; ...转载 2019-07-24 09:53:18 · 132 阅读 · 0 评论 -
剑指offer_14 按之字形顺序打印二叉树
一、题目描述 二、解题思路 三、代码实现 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ //思路: //可能需要...转载 2019-07-20 16:34:31 · 86 阅读 · 0 评论 -
图解剑指offer 18 数据流中的中位数
一、题目描述 二、大致思路 PriorityQueue原理详见: https://blog.csdn.net/qq_37767455/article/details/98632444 三、代码实现 /* 大顶堆,存储左半边元素 */ private PriorityQueue<Integer> left = new PriorityQueue<>(((o1...转载 2019-08-08 09:06:04 · 122 阅读 · 0 评论 -
图解剑指offer 19 用两个栈实现队列
一、题目描述 用两个栈实现一个队列,完成队列的Push和Pop操作。 二、解题思路 三、代码实现 Stack<Integer> in = new Stack<Integer>(); Stack<Integer> out = new Stack<>(); public void push(int node){ in....转载 2019-08-08 09:24:45 · 71 阅读 · 0 评论 -
剑指offer_37 从上到下打印二叉树
一、题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 二、大致思路 使用队列来进行层次遍历。 不需要使用两个队列分别存储当前层的节点和下一次的节点 ,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。 三、代码实现 public ArrayList<Integer> printFromTopTo...转载 2019-09-01 16:03:12 · 76 阅读 · 0 评论