
图解剑指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 · 146 阅读 · 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 · 167 阅读 · 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 · 135 阅读 · 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 · 93 阅读 · 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 · 126 阅读 · 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 · 92 阅读 · 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 · 100 阅读 · 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 · 89 阅读 · 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 · 85 阅读 · 0 评论 -
剑指offer_34 顺时针打印矩阵
一、题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1, 2, 3, 45, 6, 7, 89, 10,11,1213,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 · 110 阅读 · 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 · 118 阅读 · 0 评论 -
图解剑指offer_31 合并两个排序的链表
一、题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。二、代码实现1.理解递归:合并过程中,首先比较两个链表的首节点哪个小,较小的节点作为合成链表的首节点,之后将指针指向较小节点的后一个节点,再次进行上面逻辑的比较,可以发现比较过程是一个递归的操作。上图中代码实现:public ListNode Merge(ListNode p1, Li...转载 2019-08-16 09:40:01 · 95 阅读 · 0 评论 -
图解剑指offer_26 二进制中1的个数
一、题目请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数。二、大致思路n & (n - 1)每次计算都会消除最后一位1。用这样来计算就可以确定有多少个1.n : 10110100n - 1 : 10110011n&(n-1) : 10110000时间复杂度:O(M),其中M表示1的个数三、代码实现public...转载 2019-08-12 16:13:03 · 125 阅读 · 0 评论 -
图解剑指offer_32 树的子结构
一、题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)二、大致思路先说下算法实现思路:对于两棵二叉树来说,要判断B是不是A的子结构,首先第一步在树A中查找与B根节点的值一样的节点。通常对于查找树中某一个节点,我们都是采用递归的方法来遍历整棵树。第二步就是判断树A中以R为根节点的子树是不是和树B具有相同的结构。这里同样利用到了递归的方法,如果节...转载 2019-08-16 10:30:39 · 104 阅读 · 0 评论 -
剑指offer 35 包含Min函数的栈
1.题目定义一个栈的数据结构,要求添加一个min函数,使他能够找到栈的最小元素。2.大致思路使用两个stack,一个为数据栈,另一个为辅助栈。数据栈用于存储所有数据,辅助栈用于存储最小值。3.代码实现private Stack<Integer> dataStack = new Stack<>(); private Stack<Integer> ...转载 2019-08-31 23:36:28 · 88 阅读 · 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 · 92 阅读 · 0 评论 -
剑指offer_16 序列化二叉树
一、题目描述请实现两个函数,分别用来序列化和反序列化二叉树。二、题解可以根据前序遍历的顺序来序列化二叉树,因为前序遍历序列是从根节点开始的。在遍历二叉树碰到null指针时,这些null指针序列化为一个特殊的字符(如‘#’)。另外,节点的数值之间要用一个特殊字符(如‘,’)隔开。根据这样的序列化规则,下图中的二叉树被序列化成字符串“1,2,4,#,#,#,3,5,#,#,6,#,#”。上...转载 2019-07-28 15:37:39 · 112 阅读 · 0 评论 -
图解剑指offer 22 斐波那契数列 动态规划优于递归实现
一、题目求斐波那契数列的第n项,n <= 39二、大致思路三、代码实现A.B.C.转载 2019-08-08 09:46:41 · 142 阅读 · 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 · 124 阅读 · 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 · 125 阅读 · 0 评论 -
剑指offer_5 正则表达式匹配
题目:请实现一个函数用来匹配包含’.‘和’‘的正则表达式。模式中的字符‘.’表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"及"ab*a"均不匹配。分析:这道题的核心其实在于分析’’,对于’.‘来说,它和任意字符都匹配,可把其当做普通字符。对于’'的分...转载 2019-06-29 21:21:03 · 126 阅读 · 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 · 119 阅读 · 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 · 113 阅读 · 0 评论 -
剑指offer_7 字符流中第一个不重复的字符
一、题目:第一个只出现一次的字符题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’。要求时间复杂度为O(n)。最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是...转载 2019-07-16 09:30:50 · 145 阅读 · 0 评论 -
剑指offer_8 从尾到头打印链表
一、题目描述输入一个链表,从尾到头打印链表每个节点的值。二、题解方法一:可以遍历这个链表,遍历过程中用一个ArrayList保存里面的值,然后再从尾到头遍历这个ArrayList,存储在新的ArrayList里面返回。//使用另外一个ArrayList存储链表的方法 public static ArrayList<Integer> printListFromTai...转载 2019-07-16 10:17:44 · 100 阅读 · 0 评论 -
剑指offer_9 链表中环的入口结点
一、题目描述:一个链表中包含环,请找出该链表的环的入口结点。二、解析参见下图假设相遇于D点,则快指针应该这时刚好套慢指针一圈(2倍速的必然结果,可以数学证明)则此时快指针走的路程为 ‘AB + BCDEB + BD’ (用BCDEB表示一圈)(字母序表示方向,AB 表示A -> B)慢指针走的路程为 ‘AB + BD’由于S(快指针) = 2 * S(慢指针) (因为2倍速)(...转载 2019-07-16 13:39:48 · 113 阅读 · 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 = 6Output: 1->2->3->4->5二、题解递归public ListNode...转载 2019-07-16 14:18:35 · 147 阅读 · 0 评论 -
剑指offer_12 查找二叉树的下一个节点
一、题目描述:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?数中的节点除了有两个分别指向 左、右节点的指针,还有一个指向父亲节点的指针。二、题解我们首先看一棵树:对于求一棵二叉树中序遍历序列中一个节点的下一个节点一般会有3种情况第一种情况: 节点有右子树,则下一节点就从它的右子树中查找如图第二种情况:没有右子节点,而且它还是其父节点的左子节点。如图:...转载 2019-07-19 09:46:33 · 163 阅读 · 0 评论 -
剑指offer_13 对称的二叉树
一、题目描述题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。二.、题解如上图所示:第一棵二叉树是对称的,剩下两棵都不是对称的。通常我们有三种不同的二叉树遍历方法:前序遍历、中序遍历以及后续遍历。在这三种遍历算法中,都是先遍历左子节点再遍历右子节点。我们是否可以定义一种遍历算法,先遍历右子节点在遍历左子节点呢?比如我们针对前序遍历定义一种...转载 2019-07-19 09:59:08 · 106 阅读 · 0 评论 -
剑指offer_11 根据先序遍历和后序遍历构建二叉树
一、前序和后序遍历二、题解解题思路:还是可以根据一般的思路,采用递归思想,对于每一个先序序列,划分出对应的根节点、左子树、右子树范围即可自上而下构建出二叉树。例如对于上例中的先序序列[1,2,4,5,3,6,7],第一个节点一定为根节点,第2到第i个节点为左子树,第i+1到最后一个节点为右子树,那么问题就可以简化为:如何确定左右子树分界点?对于这个简化过后的问题,从后序遍历序列上很...转载 2019-07-16 21:59:05 · 413 阅读 · 0 评论 -
剑指offer_15 把二叉树打印成多行
一、题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。这道题目与“从上往下打印二叉树”很相似,可以用队列来解决。但是区别在于这道题目需要将每一层进行分行。二、代码实现/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; ...转载 2019-07-24 09:53:18 · 163 阅读 · 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 · 106 阅读 · 0 评论 -
图解剑指offer 18 数据流中的中位数
一、题目描述二、大致思路PriorityQueue原理详见:https://blog.youkuaiyun.com/qq_37767455/article/details/98632444三、代码实现/* 大顶堆,存储左半边元素 */ private PriorityQueue<Integer> left = new PriorityQueue<>(((o1...转载 2019-08-08 09:06:04 · 145 阅读 · 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 · 92 阅读 · 0 评论 -
剑指offer_37 从上到下打印二叉树
一、题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。二、大致思路使用队列来进行层次遍历。不需要使用两个队列分别存储当前层的节点和下一次的节点 ,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。三、代码实现public ArrayList<Integer> printFromTopTo...转载 2019-09-01 16:03:12 · 91 阅读 · 0 评论