
剑指offer
ysl_ysl123
这个作者很懒,什么都没留下…
展开
-
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路中序遍历二叉搜索树,并用一个指针pre记录遍历的上一个结点,即排序的双向链表中当前结点的前驱结点,当前结点的左指针指向pre(左指针记录前驱结点),pre的右指针指向当前结点(右指针记录后继结点)。代码(c++)/*struct TreeNode { int ...原创 2019-05-27 10:15:14 · 152 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路合法的二叉搜索树的后序遍历结果:设一个序列sq的最后一个元素为x,除去最后一个元素剩余序列subsq可以被x分为两个子序列,其中左子序列(左子树)的元素都小于x,右子序列(右子树)的元素都大于x,且左右两个子序列也分别满足这样的条件。所以,递...原创 2019-05-24 17:17:07 · 143 阅读 · 0 评论 -
树的子结构
树的子结构输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路判断A树中当前结点是否与B树的根结点相同,如果不相同,接着遍历A树;如果相同,则A树从当前结点与B树从根结点开始同步遍历,直至B树遍历完且遍历过程中A、B两树对应结点都相同,则B树是A树的子结构;否则返回,重新在A树中寻找与B树根结点相同的结点,接着遍历。/*struct TreeNo...原创 2019-05-23 22:02:41 · 132 阅读 · 0 评论 -
链表相关问题
链表中的倒数第k个结点输入一个链表,输出该链表中倒数第k个结点。思路在牛客网上看到一个很巧妙的方法。设置两个指针p,q。其中q先移动k-1步,然后p和q一起往后移,直至q移动到链表末尾。此时p指向的元素即为倒数第k个元素。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), ...原创 2019-05-23 16:43:38 · 134 阅读 · 0 评论 -
二进制位操作
二进制操作二进制中1的个数输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路1用count记录n中1的个数。判断此时n的最后一位是否为1,如果是count加1,否则不加,然后n右移一位,直至等于0为止。这种思路只有在n>0的时候可以。当n<0时,n每次右移最高位补1而不是0(n>0时右移最高位补0),最终陷入死循环。class Solution {...原创 2019-05-23 11:04:39 · 506 阅读 · 0 评论 -
斐波那契数列及其变型
斐波那契数列及其变型原始斐波那契数列大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39思路F(n) = F(n-1) + F(n-2)class Solution {public: int fib[40]={0}; int Fibonacci(int n) { if(n==0) ret...原创 2019-05-22 17:37:28 · 235 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路第一步:遍历链表,复制每一个结点,并将复制的结点连接在原结点后面(复制next指针)第二步:遍历链表,判断结点特殊指针是否为空,如果不为空,则将该结点特殊指针连接...原创 2019-05-25 16:21:18 · 129 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路递归遍历链表,如果当前元素与下一元素不相同,则继续递归;如果相同,则从此结点开始,顺序遍历之后的结点,直至元素不相同,再从该结点开始往下递归。代码(c++)/...原创 2019-06-04 15:14:49 · 115 阅读 · 0 评论 -
二叉树的下一个结点(寻找中序遍历中某一结点的后继结点)
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路1首先想到类似的题目:二叉搜索树与双向链表,即先将二叉树按中序遍历的顺序转成双向链表(或单链表),然后返回给定结点的下一个结点即可。代码(c++)/*struct TreeLinkNode { int val; struct ...原创 2019-06-04 17:05:29 · 836 阅读 · 0 评论 -
动态数据中求最大值或最小值
1、包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路用一个栈st1装载数据,利用一个辅助栈st2记录此时st1栈中的最小数据,每次元素入栈st1,和此时st2中的栈顶元素比较,若入栈元素比st2栈顶元素小或等于栈顶元素,则入栈st1同时入栈st2,;否则只入栈st1。st1出栈时,也同st2栈顶元素比较,若...原创 2019-06-11 11:15:19 · 1750 阅读 · 0 评论 -
重建二叉树
重建二叉树(剑指offer第四题)输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路递归重建二叉树。每次递归,在中序序列中寻找此时对应先序序列的首元素。然后以此元素为界划分中序序列为左右两个子序列L1,L...原创 2019-05-22 10:38:04 · 95 阅读 · 0 评论 -
字符串的排列(有字符重复)
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路全排列就是从第一个数字起,每个数分别与它后面的数字交换,从字符串最后逐个往前执行此步骤(递归)。代码(c++)class Solut...原创 2019-05-27 14:59:55 · 1057 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路从低位到高位依此判断出现过1的次数,以百位为例:1、如果当前位是0...原创 2019-05-29 15:27:30 · 205 阅读 · 0 评论 -
丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路由丑数的定义可知,丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到。那么我们设置三个索引i2,i3,i5分别表示索引指向的数要乘2,3,5。1是第一个丑数,所以一开始三个索引都指向1,然后循环N次,...原创 2019-05-29 17:19:21 · 195 阅读 · 0 评论 -
按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路运用两个栈odd,even分别存放奇数层和偶数层的结点地址。1、当栈odd不为空时,依次将元素出栈并保存结点数值,然后按先左后右的顺序将结点的孩子结点压入even栈中;2、当栈even不为空时,依次将元素出栈并保存结点数值,然后按先右后左...原创 2019-06-05 15:33:58 · 116 阅读 · 0 评论 -
把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路1(两个队列)和按之字形顺序打印二叉树思路类似,运用两个队列,分别记录奇数层与偶数层的结点,然后依次保存达到分层打印的效果。代码(c++)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;...原创 2019-06-05 17:51:06 · 112 阅读 · 0 评论 -
序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树思路首先来解释一下什么是序列化和反序列化二叉树。如下图所示的二叉树。序列化二叉树就是以先序、中序、后序、层序任意一种遍历二叉树的方法将二叉树遍历,结点值之间以逗号分隔,空指针以井号代替。以先序序列为例,序列化上图二叉树的结果就是[1,2,4,#,#,5,#,#,3,#,#]。反序列化二叉树就是给定如上所示的序列,以序列化时的遍历方法...原创 2019-06-06 16:28:35 · 347 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路原来想着直接用一个vector装载数据,然后每次排序取中位数。这样作时间复杂度比较大,而且随着数据增...原创 2019-06-09 21:53:14 · 117 阅读 · 0 评论 -
正则表达式匹配
题目描述请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路1、首先考虑字符串与模式串中有空串的情况:a.当字符串和模式串都为空的时候,说明匹配完成...原创 2019-06-03 20:07:05 · 277 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路1、首先判断链表中是否有环。利用快慢指针,即快指针一次移动两步,慢指针一次移动一步,如果链表中有环,那么快慢指针迟早会相遇。所以以快慢指针是否会相遇为条件判断链表中是否有环。2、如果有环,找环的入口点。如上图所示,起点为S,环的入口点为A,快慢指针的相遇结点为B,假设快慢指针在环中顺时针移动。其中SA的...原创 2019-06-04 11:09:34 · 122 阅读 · 0 评论 -
构建乘积数组
题目描述给定一个数组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]。不能使用除法。思路(剑指offer)B[i]的值可以看作图中每行的乘积。先计算图中下三角B[i]的累乘值;再倒着(从倒数第二行开始)将上三角B[i]的累乘值乘到对应下三角B[i]的累乘值上,求出B[i]。...原创 2019-06-02 16:27:46 · 113 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)(约瑟夫环问题)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一...原创 2019-06-01 16:30:48 · 234 阅读 · 0 评论 -
左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路一开始我是用队列来模拟这个循环左移操作的,后来在牛客网上看到一个很巧妙的做法。假设字符串a...原创 2019-05-31 16:04:53 · 122 阅读 · 0 评论 -
判断一棵树是否是平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路后序遍历二叉树,即先算出左子树的高度,再算出右子树的高度,判断左右子树的高度差,如果小于等于1,则返回根结点的高度(左右子树当中最高的高度加1);否则此根结点不满足平衡二叉树的条件,终止遍历。代码(c++)class Solution {public: int postorder(TreeNode* pRoot){ ...原创 2019-05-30 17:31:52 · 242 阅读 · 0 评论 -
数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,size<...原创 2019-05-30 11:50:34 · 142 阅读 · 0 评论 -
求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路利用构造函数计算。代码(c++)class Temp{public: Temp(){ n++; sum+=n; } static void init(){ n=0;...原创 2019-09-11 15:57:14 · 306 阅读 · 0 评论