剑指offer
剑指offer题解
baidu-liuming
机器学习 深度学习 大数据 自然语言处理 linux python shell hive 算法
展开
-
剑指offer - 二叉树中和为某一值的路径
题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路 借助ArrayList< ArrayList < Integer >>结构,存储多条路径。假设内部子链表为innerList,外部链表arrayList。 1.若当前遍历的节点为空,直接返回arrayList;若当...原创 2018-04-10 20:40:20 · 144 阅读 · 0 评论 -
剑指offer - 二叉搜索树与双向链表
题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路 二叉搜索树的左子树的根节点小于中间节点,右子树的根节点大于中间节点;因此,可以参考中序遍历,遍历二叉树。 1.设置两个变量head和realHead,head存储当前子树的根节点,readHead存储二叉树拥有最小节点值的节点,(二叉搜索树中序遍历的第一个节点)。...原创 2018-04-11 11:37:16 · 138 阅读 · 0 评论 -
剑指offer-二叉树镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。 思路:最简单的一类递归问题,从根节点开始交换左右子节点。public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.va...原创 2018-04-09 19:37:53 · 149 阅读 · 0 评论 -
剑指offer-顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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 ArrayList<Integer> prin...原创 2018-04-09 20:40:16 · 137 阅读 · 0 评论 -
剑指offer-栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路:设置临时变量index指向弹出序列popA的第一个元素,遍历压入序列pushA的元素进...原创 2018-04-09 21:58:38 · 208 阅读 · 0 评论 -
剑指offer-按行打印二叉树
题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路 借助队列,首先将链表头节点放入队列中,判断队列的头节点是否有左右子节点,如果有放入队列中,...原创 2018-04-10 15:35:38 · 449 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路 后序遍历序列的最后一个元素为当前子树的根节点,根节点大于左子树的所有元素,小于右子树的所有元素。若当前序列不满足上一条件则返回false,若满足上述条件,继续遍历左子树和右子树序列是否为后序遍历序列。public class S...原创 2018-04-10 16:43:03 · 133 阅读 · 0 评论 -
剑指offer-反转链表
输入一个链表,反转链表后,输出链表的所有元素。 链表结构public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}算法思路: 1. 若链表空,直接返回头结点 2. 若链表不为空,设置pre, cur, ...原创 2018-03-28 15:56:25 · 133 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
输入一个链表,从尾到头打印链表每个节点的值。 链表结构:public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}思路:借助栈为“先进后出”的结构,初始化新的链表,首先判断原链表是否为空,若为空直接返回新链表头...原创 2018-03-28 16:34:46 · 204 阅读 · 0 评论 -
剑指offer-二维数组查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 1. 判断矩阵是否为:null、{}、{{}}这三种情况,若为三种情况的一种,则直接返回false; 2. 因矩阵是从左到右,从上到下逐步递增的。以矩阵的左下角为初始点,若目标值小于初始节点,则向上遍历;若...原创 2018-04-03 10:46:57 · 125 阅读 · 0 评论 -
剑指offer-替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 思路:将字符串转换成字符数组,逐个遍历字符数组,若遇到空格,则替换 public String replaceSpace(StringBuffer str) { char[] charArray = ...原创 2018-04-03 11:31:20 · 110 阅读 · 0 评论 -
剑指offer-重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:已知前序遍历和中序遍历求解二叉树 当前子树的前序遍历头结点为二叉树的根节点,在中序遍历序列中,根节点元素的左边序列为左子树节点,右序列为右子树...原创 2018-04-03 16:13:55 · 133 阅读 · 0 评论 -
剑指offer-二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思想:假设该数的大小为n,若n为0,则n的二进制中1的个数为0; 若n不为0,则n的二进制中必含有1; n-1的二进制表示,实际上是将n中最右边1的位置iii二进制置为0,iii右边所有元素置为111,即将最右边1的位置及其后续元素取反 n&(n-1):表示将n最右边的1置为0,实际上就是删除了一个1,那...原创 2018-04-03 16:26:34 · 227 阅读 · 0 评论 -
斐波那契数列--动态规划版
斐波那契数列,n=0开始:0, 1, 1, 2, 3, 5…… 暴力方法 public int Fibonacci(int n) { if(n <= 0) return 0; if(n == 1) return 1; return Fibonacci(n-1) + Fibonacc...原创 2018-04-04 15:33:37 · 401 阅读 · 0 评论 -
剑指offer-两个栈实现队列
题意:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路: 栈的特点:后进先出 队列的特点:先进先出; 入队:直接进入stack1中; 出队:若stack2不为空,将stack2的元素直接出栈; 若stack2为空,将stack1中的所有元素压入stack2**(只有这样才能保证先进先出结构)**,然后从stack2中出栈一个元...原创 2018-04-07 17:13:30 · 127 阅读 · 0 评论 -
剑指offer-旋转数组最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:若数组的长度大于等于2,最小的数字一定比前一个小;并处理掉数组为空和数组长度为1的时候。publi...原创 2018-04-07 17:31:09 · 282 阅读 · 0 评论 -
LeetCode50:二分快速幂
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路:应概率到幂次有正有负public double Power(double base, int exponent) { if(exponent == 0){ return 1; } int exp...原创 2018-04-07 18:41:14 · 267 阅读 · 0 评论 -
剑指offer - 链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个结点。 思路:设置该链表的两个指针指向头节点,第一个指针先走到第k个节点; 然后两个指针往后走,先走的指针走到最后一个,第二个指针指向第k个节点。 边界检查:a. 链表为空 b. k为0或k的长度大于链表的长度。/*public class ListNode { int val; L...原创 2018-04-08 15:18:13 · 227 阅读 · 0 评论 -
剑指offer-合并两个有序链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路:假设两链表分别为list1和list2,若一个为空,则返回另外一个链表的头结点。若两个都不为空,设置head和curNode两个变量,head记录头节点,curNode记录当前节点。按照两链表的值的大小更新当前curNode。 链表结构:public class ListNode ...原创 2018-04-08 19:46:38 · 332 阅读 · 0 评论 -
剑指offer-树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路:将原始问题分为两个子问题 a. 在树A中寻找和树B根节点的值一样的结点R b. 判断在树A中以R为根节点的子树,是否和树B拥有一样的结构 树结构:public class TreeNode { int val = 0; TreeNode left = null; ...原创 2018-04-08 22:00:58 · 149 阅读 · 0 评论