![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 61
HxxxxxxxU
我就是我 不一样的花火
展开
-
剑指offer:机器人的运动范围(考点:回溯法)
题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?分析:本题使用的方法同样还是回溯法,另外还需要会计...原创 2018-03-27 18:45:01 · 3593 阅读 · 1 评论 -
JAVA: 二叉树的深度
题目:输入一棵二叉树,求该树的深度。 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析:解法一:递归如果一棵树只有一个结点,则深度为1。如果根节点只有左子树没有右子树,那么树的深度为其左子树深度加1。同样如果根节点没有左子树只有右子树,那么树的深度应该是右子树深度加1。如果既有左子树又有右子树,则输的深度应该是左、右子树深度的较大值加上1。public...原创 2018-03-13 19:25:07 · 214 阅读 · 0 评论 -
剑指Offer : 数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。分析:因为是排序数组,肯定想到的是二分查找,使用二分查找找到第一次和最后一次数字k的位置,即可统计出出现的次数。package Solution25;//统计一个数字在排序数组中出现的次数。public class Solution { //由于数组有序,所以使用二分查找方法定位k的第一次出现位置和最后一次出现位置 public in...原创 2018-03-13 17:03:45 · 116 阅读 · 0 评论 -
剑指offer:正则表达式匹配
题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配.分析:观察模式串中第二个字符是不是"*"若模式串中第二个字符不是"*"原创 2018-03-19 19:57:01 · 133 阅读 · 0 评论 -
剑指offer:二叉搜索树的第k个结点(考点:中序遍历)
题目:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。分析:采用中序遍历二叉搜索树,得到的遍历顺序为递增顺序,易得到第k大结点解法一:采用非递归中序遍历TreeNode KthNode(TreeNode pRoot, int k) { if(pRoot==null||k<0){ ...原创 2018-03-23 11:10:57 · 1004 阅读 · 0 评论 -
JAVA: 两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。分析:解法一:利用hashmap的特性。import java.util.HashMap;public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode current1=pHea...原创 2018-03-13 16:25:04 · 118 阅读 · 0 评论 -
剑指offer:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树分析:如果二叉树的序列化是从根结点开始的话,那么相应的反序列化在根节点的数值读出来的同时就可以开始。因此,可以根据前序遍历的顺序来序列化二叉树,因为前序遍历是从根结点开始的。算法思想:根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。依据前序遍历序列来序列化二叉树,因为前序遍历...原创 2018-03-23 10:02:06 · 95 阅读 · 0 评论 -
JAVA: 栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)import java.util.Stack;public class Solution {...原创 2018-03-06 11:12:56 · 123 阅读 · 0 评论 -
JAVA: 包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。package StackAndQueue;import java.util.Stack;//实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。public class MinStack { Stack<Integer> stack; Stack<Integ...原创 2018-03-06 10:17:29 · 257 阅读 · 0 评论 -
JAVA: 顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.1 2 3 45 6 7 89 10 11 1213 14 15 16方法一:...原创 2018-03-05 22:17:53 · 1040 阅读 · 0 评论 -
JAVA: 二叉树的镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5求树的镜...原创 2018-03-05 20:44:05 · 144 阅读 · 0 评论 -
JAVA: 树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result=false; if(root1!=null && r...原创 2018-03-05 20:26:13 · 347 阅读 · 0 评论 -
剑指offer(LintCode):表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。分析:主要考察字符串中的加减标记符号、e或E符号、小数点以及原创 2018-03-19 20:53:14 · 182 阅读 · 0 评论 -
剑指offer:字符流中第一个不重复的字符
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。分析:可以使用hashmap来存放字符键,值为出现的次数。package Solution42;import java.util...原创 2018-03-19 21:35:55 · 131 阅读 · 0 评论 -
JAVA: 平衡二叉树
题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。分析:解法一:重复遍历结点多次的方法在遍历树的每个结点时,调用TreeDepth得到它的左右子树的深度。如果每个结点的左右子树深度都不超过1,则整棵树为平衡二叉树。但是,这种方法存在一个结点被重复遍历的现象。public boolean IsBalanced_Solution(TreeNode root) { if(root==n...原创 2018-03-13 20:35:17 · 112 阅读 · 0 评论 -
剑指offer:按之字形顺序打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。分析:读完题,可以确定本题是用树的层次遍历做,无非就是变形的层次遍历。首先,第一行从左到右顺序打印,即根结点。从第二层开始,需要从右往左顺序打印,即先打印右结点,在打印左结点,看起来是层次遍历的先进后出,因此可以用栈来实现。打印第三层时,需要从左往右...原创 2018-03-22 10:39:34 · 90 阅读 · 0 评论 -
剑指offer:对称的二叉树
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析:如果先序遍历的顺序分为两种先左后右和先右后左两种顺序遍历,如果两者相等说明二叉树是对称的二叉树。同时需要考虑在遍历过程中遇到的NULL指针。package Solution46;//请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,...原创 2018-03-21 15:36:01 · 100 阅读 · 0 评论 -
剑指offer:二叉树的下一个结点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析:如果结点p有右子树,则中序遍历下一个结点就是它右子树的最左子节点;如果结点p没有右子树,分为两种情况:结点p是其父结点的左子树,返回p的父结点即可。结点p是其父结点的右子树,则沿着父结点往上遍历直到找到一个是它父结点的左子节点,返回这个父结点。代码如下:...原创 2018-03-21 15:11:48 · 82 阅读 · 0 评论 -
剑指offer:矩阵中的路径(考点:回溯法)
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩...原创 2018-03-25 17:04:25 · 285 阅读 · 0 评论 -
算法——回溯法
转自:https://blog.csdn.net/hguisu/article/details/77092761.回溯法算法思想:定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。1、回溯法适用:有许多问题...转载 2018-03-25 15:34:00 · 1179 阅读 · 0 评论 -
剑指offer:滑动窗口的最大值
题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1...原创 2018-03-24 22:22:58 · 111 阅读 · 0 评论 -
剑指offer(LintCode):112. 删除链表中重复节点I VS 113.删除链表中重复节点II
两题的区别在于重复的结点是全部删掉还是只留下一个。删除链表中重复节点I :题目:给定一个排序链表,删除所有重复的元素,每个元素只留下一个。分析:定义指针last指向第一个结点(不管重复不重复),指针pNode指向当前节点。如:1->1->2->3->3->null,last和pNode初始都指向head结点(1),当pNode!=null &&...原创 2018-03-20 21:56:49 · 122 阅读 · 0 评论 -
JAVA: 和为S的两个数 VS 和为S的连续正数序列
题目一:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。对应每个测试案例,输出两个数,小的先输出。分析:因为数组是有序的,因此定义两个指针,分别指向数组第一个元素和最后一个元素,并计算和s。若s>S,则把最后一个指针往前移动一位,再判断。若s<S,则把第一个指针往后移动一位,再判断。package Solu...原创 2018-03-14 16:07:36 · 100 阅读 · 0 评论 -
剑指offer:数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。分析:解法一:可以使用数组来存放插入的数,然后进行排序,再根据数组长度为奇数偶数来确定中位数。注意:需要重写比较器接口。这种方法插入的时间复杂度为O(n),得到中位数的时间复杂度为O(1)。import ja...原创 2018-03-24 14:55:41 · 152 阅读 · 0 评论 -
JAVA: 数组中只出现1次的数
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析:解法一:若没有规定空间复杂度为O(1),则可以利用hashmap的特性来存储数字及其出现的次数,在对hashmap的value值进行排序,前两个key值即为所求。public class Solution { //num1,num2分别为长度为1的数组。传出参数 //将num1[...原创 2018-03-14 14:57:09 · 353 阅读 · 0 评论 -
剑指offer:链表中环的入口结点(变型:判断链表是否有环)
题目:一个链表中包含环,请找出该链表的环的入口结点。(变型题:链表中是否有环?)分析:A->B->C->D->B->C->D方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节点当中存在相同节点ID,则说明该节点被遍历过两次,链...原创 2018-03-20 15:16:23 · 189 阅读 · 0 评论 -
JAVA: 第一个只出现1次的字符
题目:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置分析:1. 用hashmap存储所有字符,key值为字符,value值为出现的次数 2. 按照字符串的顺序去查找hashmap,找到第一个value值为1的,返回该字符的下标即可。package Solution22;import java.util.*;...原创 2018-03-12 10:08:00 · 164 阅读 · 0 评论 -
JAVA: 丑数
题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数分析:一个数m是另一个数n的因子,是指n能被m整除,也就是m%n==0.解法一:逐一判断每个数,时间效率很低。public class Solution { //解法一:逐一判断每个数是不是丑数 pub...原创 2018-03-11 23:00:05 · 342 阅读 · 0 评论 -
剑指offer:求1+2+...+n
题目:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。分析:求和除了公式n(n+1)/2之外,无非就循环和递归。但是这三种在本题目下常规下都不能用,因为要求不能使用乘除法、for循环和if判断语句来终止递归。利用逻辑与的短路特性,A&&B,若A为假,则B不需要运算即可返回false,从而实...原创 2018-03-16 09:51:36 · 119 阅读 · 0 评论 -
剑指offer:圆圈中最后剩下的数字
题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。(约瑟夫环问题)分析:方法一:用数组来组成环。但是这种方法要格外注意下标的处理,此方法需要额外空间复杂度O(n),时间复杂度也为O(mn)。public class Solution { public int LastRemaining_Solution(int...原创 2018-03-15 15:49:04 · 139 阅读 · 0 评论 -
JAVA: 旋转数组的最小值
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析: 考察二分查找。旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素。注意...原创 2018-03-01 11:31:59 · 493 阅读 · 1 评论 -
JAVA: 数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析:解法一:基于hashmappublic int MoreThanHalfNum_Solution1(int [] array){ HashMap<Inte...原创 2018-03-08 21:25:48 · 1459 阅读 · 0 评论 -
JAVA: 扑克牌顺子
题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看成是任何数字。分析:把大小王设置为0,因为0可以看成是任何数,所以我们只需要统计排序好后的数组中相邻元素之间差的个数,若小于0的个数,就可以完全用0来填充。把数组排序;统计数组中0的个数;统计排序之后的数组中相邻数字之间的空缺总数,如果空缺总数小于等于0...原创 2018-03-15 13:26:25 · 813 阅读 · 0 评论 -
JAVA: 字符串的排列和组合问题
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。import java.util.ArrayList;import java.util.Collections;public class Solution { public ArrayList<S...原创 2018-03-08 15:55:31 · 427 阅读 · 0 评论 -
JAVA: 翻转单词 VS 左旋转字符串
题目一:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?方法一: 先翻转整个句子,然...原创 2018-03-14 22:08:28 · 112 阅读 · 0 评论 -
JAVA: 二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解法一:递归算法 1、将左子树构成双链表,并返回该链表的头节点(左子树最左边的节点) 2、定位到左链表的最后一个节点(左子树最右边的节点) 3、如果左子树链表不为空,则将当前root追加到左子树链表后 4、将右子树构造成双向链表,并返回链表头结点(右子树最...原创 2018-03-08 14:56:29 · 126 阅读 · 0 评论 -
JAVA: 复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析:在不用辅助空间的前提下,以O(n)的时间效率实现。第一步:根据原始链表的每个结点N创建对应的N',把N'链接在N之后。第二步:根据原链表,设置复制出来的结点的random指针...原创 2018-03-07 16:19:46 · 182 阅读 · 0 评论 -
JAVA: 二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。分析: 路径的定义:从根结点到树叶结点之间的所有结点。 按照前序遍历的顺序遍历二叉树。 路径的保存:每次找到路径之后,应将路径保存到 ArrayList<ArrayList<Integer>> result 中,最...原创 2018-03-07 15:07:53 · 192 阅读 · 0 评论 -
JAVA: 二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:二叉搜索树的后序遍历结果的最后一位是根节点,数组中前面的数字可以分为两部分:第一部分是左子树结点的值,根节点的所有左子树的结点值都比根节点小;第二部分是右子树结点的值,所有右子树上的结点值都比根节点大。public boolean VerifySqu...原创 2018-03-07 13:21:52 · 107 阅读 · 0 评论 -
剑指offer:不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析:不能+、-、*、/,则能用于数字计算的只有位运算。第一步不考虑进位对每一位相加。0+0,1+1都为0,0+1,1+0都为1,这和异或^的运算结果一样。第二步只考虑进位,对0+1,1+0,0+0都为0,只有1+1为1,并且往左进位为10.重复上述,直到不进位,即进位数为0。例子:5+7=12 5:...原创 2018-03-16 13:57:49 · 96 阅读 · 0 评论