剑指Offer
yj_coder
这个作者很懒,什么都没留下…
展开
-
AcWing 73. 数组中只出现一次的两个数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。你可以假设这两个数字一定存在。样例输入:[1,2,3,3,4,4]输出:[1,2]问题分析将所有的数异或起来,得到的结果就是只出现一次的那两个元素的异或结果。这个结果中的各位中为1的是两个数在该位上不同的,一个数在该位上是1,另一个数在该位上是0。我们假设找到异或...原创 2019-05-14 00:20:44 · 320 阅读 · 0 评论 -
AcWing 55. 连续子数组的最大和
题目描述输入一个非空整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18问题分析此题O(n)的解法是用动态规划。dp[i]是以i结尾的最大子序和,如果dp[i-1]小于0,那么dp[i]等于num...原创 2019-05-12 12:09:39 · 148 阅读 · 0 评论 -
AcWing 54. 数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。样例输入:1, 2, 3, 4输出:1,1.5,2,2.5解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。问题分析创建一个小顶堆和一个大顶堆,小顶堆保...原创 2019-05-12 12:09:25 · 109 阅读 · 0 评论 -
AcWing 52. 数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,并且一定存在满足条件的数字。思考题:假设要求只能使用O(n) 的时间和额外O(1) 的空间,该怎么做呢?样例输入:[1,2,1,1,3]输出:1问题分析此题用计数统计法来解。先设众数ans为nums[0],并且将count置为。然后从编号1的位置开始遍历数组,当遇到的数等于...原创 2019-05-12 12:09:13 · 105 阅读 · 0 评论 -
AcWing 51. 数字排列
题目描述输入一组数字(可能包含重复数字),输出其所有的排列方式。样例输入:[1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]问题分析此题大体上参照 leetcode 4...原创 2019-05-12 12:08:51 · 191 阅读 · 0 评论 -
AcWing 50. 序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。样例你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"注意:以上的格式...原创 2019-05-11 14:02:48 · 145 阅读 · 0 评论 -
AcWing 48. 复杂链表的复刻
题目描述请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。问题分析此题有O(n)时间复杂度,并且空间复杂度为常数的算法,而且是此题的经典算法。1. 先把原链表的每个节点拷贝一份,就是在原链表的每个节点后面连接上一个该节点的拷贝。2. 然后把新创建的节点的random指向它的原节点的rando...原创 2019-05-11 14:02:33 · 217 阅读 · 0 评论 -
AcWing 45. 之字形打印二叉树
题目描述请实现一个函数按照之字形顺序从上向下打印二叉树。即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null] 8 / \ 12 2 / \ 6 4输出:...原创 2019-05-11 14:02:21 · 132 阅读 · 0 评论 -
AcWing 44. 分行从上往下打印二叉树
题目描述从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4输出:[[8], [12, 2], [6], [4]]问题分析此题需要将各...原创 2019-05-11 14:02:10 · 209 阅读 · 2 评论 -
AcWing 41. 包含min函数的栈
题目描述设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 getMin()–得到栈中最小元素样例MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);minSta...原创 2019-05-11 14:01:58 · 111 阅读 · 0 评论 -
AcWing 40. 顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。样例输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]问题分析此题我用的是有限状态机的方法。把当前遍历状态分为4种,分别代表不同方向。还有4个变量代表接下来可遍历的范围:行的上限和下...原创 2019-05-11 14:01:13 · 130 阅读 · 0 评论 -
AcWing 39. 对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树: 1 / \ 2 2 / \ / \3 4 4 3如下图所示二叉树[1,2,2,null,4,4,3,...原创 2019-05-11 14:01:34 · 113 阅读 · 0 评论 -
AcWing 38. 二叉树的镜像
题目描述输入一个二叉树,将它变换为它的镜像。样例输入树: 8 / \ 6 10 / \ / \ 5 7 9 11 [8,6,10,5,7,9,11,null,null,null,null,null,null,null,null] 输出树: 8 / \ 10 6 / \ / \ 11 9 7 ...原创 2019-05-11 14:01:00 · 98 阅读 · 0 评论 -
AcWing 84. 求1+2+…+n
题目描述求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。样例输入:10输出:55问题分析本题用递归来解决,这需要在n=0的时候跳出递归,所以用 && 来实现。代码实现class Solution {public: int getSum(int n) {...原创 2019-05-07 19:39:06 · 188 阅读 · 0 评论 -
AcWing 82. 圆圈中最后剩下的数字
题目描述0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。样例输入:n=5 , m=3输出:3问题分析在这n个数字中,第一个被删除的数字是(m-1)%n,为简单起见记为k。那么删除k之后的剩下n-1的数字为0,1,…,k-1,k+1,…,n-1,并且下一个开始计数的数字是k+1...原创 2019-05-07 19:28:40 · 103 阅读 · 0 评论 -
AcWing 81. 扑克牌的顺子
题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。样例1输入:[8,9,10,11,12]输出:true样例2输入:[0,8,9,11,12]输出:true问题分析先将数组排序,...原创 2019-05-07 18:51:55 · 275 阅读 · 0 评论 -
AcWing 36. 合并两个排序的链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。样例输入:1->3->5 , 2->4->5输出:1->2->3->4->5->5问题分析创建一个新的链表来表示合并后的链表,当l1和l2都不为空时,比较两个节点的值,然后将新的链表的next节点就设为此节点。并将l1和l2中小的那...原创 2019-05-11 14:00:40 · 126 阅读 · 0 评论 -
AcWing 35. 反转链表
题目描述定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。样例输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL问题分析 1迭代法。各节点的位置不动,原地改变各节点的指向为指向前一个节点。创建一个变量newhead,初始值为NULL,然后当head不为...原创 2019-05-11 14:01:45 · 109 阅读 · 0 评论 -
AcWing 66. 两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。样例给出两个链表如下所示:A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3输出第一个公共节点c...原创 2019-05-12 12:09:53 · 115 阅读 · 0 评论 -
AcWing 70. 二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。你可以假设树和k都存在,并且1≤k≤树的总结点数。样例输入:root = [2, 1, 3, null, null, null, null] ,k = 3 2 / \ 1 3输出:3问题分析用迭代法进行二叉树的中序遍历,遍历到每个非空节点时都将计数加1,当计数值等于k时,返回当前节点的值。...原创 2019-05-12 12:10:05 · 102 阅读 · 0 评论 -
AcWing 62. 丑数
题目描述我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。求第n个丑数的值。样例输入:5输出:5注意:习惯上我们把1当做第一个丑数。问题分析三指针法。创建丑数数组vec,变量 i, j, k 分别指示着权重2,3,5所对应的位置。下一个丑数定义为丑数数组中三个位置的数分别乘以相应的权重,所得...原创 2019-05-14 00:20:29 · 139 阅读 · 0 评论 -
AcWing 56. 从1到n整数中1出现的次数
题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含“1”的数字有1,10,11和12,其中“1”一共出现了5次。样例输入: 12输出: 5问题分析假设我们要计算一个六位数abcdef有多少个1,那么我们要计算6个位置分别出现了多少次1,最后把6个位置的结果加和就是答案了。假如当前正在计算位置 c 出现了多少个...原创 2019-05-14 00:19:57 · 142 阅读 · 0 评论 -
AcWing 42. 栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列...原创 2019-05-14 00:19:33 · 137 阅读 · 0 评论 -
AcWing 32. 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。样例输入:[1,2,3,4,5]输出: [1,3,5,2,4]问题分析此题用双指针。定义两个指针,一个为 i ,一个为 j ,初始时分别指向数组array的首端和尾端。当 i 和 j 没有相遇时,进入while循环,判断如果 i 指的元素是...原创 2019-05-13 17:11:17 · 129 阅读 · 0 评论 -
AcWing 31. 表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。注意:小数可以没有整数部分,例如.123等于0.123; 小数点后面可以没有数字,例如233.等于233.0; 小数点前面...原创 2019-05-13 17:11:03 · 146 阅读 · 0 评论 -
AcWing 85. 不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。样例输入:num1 = 1 , num2 = 2输出:3问题分析先把num1和num2按位“与”,再左移一位就得到了进位的结果,把该结果记为carry。然后把num1和num2异或,得到的是不算进位的加法结果,然后把该结果赋给num1,把carry赋给num2,判断当num2大于0时...原创 2019-05-13 17:10:52 · 118 阅读 · 0 评论 -
AcWing 14. 不修改数组找出重复的数字
题目描述给定一个长度为n+1 的数组nums,数组中所有的数均在1∼n的范围内,其中n≥1。请找出数组中任意一个重复的数,但不能修改输入的数组。样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。思考题:如果只能使用O(1) 的额外空间,该怎么做呢?问题分析此题要求常数的空间复杂度,所以哈希表不能用了,又要求不...原创 2019-05-13 17:09:06 · 136 阅读 · 0 评论 -
AcWing 88. 树中两个结点的最低公共祖先
题目描述给出一个二叉树,输入两个树节点,求它们的最低公共祖先。一个树节点的祖先节点包括它本身。注意:输入的二叉树不为空; 输入的两个节点一定不为空,且是二叉树中的节点;样例二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4...原创 2019-05-13 17:08:55 · 146 阅读 · 0 评论 -
AcWing 87. 把字符串转换成整数
题目描述请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。样例输入:"123"输出:123注意:你的函数应满足下列条件:忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数; 整数后可能有任意非数字字符,请将其忽略; 如果整...原创 2019-05-13 17:08:42 · 181 阅读 · 0 评论 -
AcWing 86. 构建乘积数组
题目描述给定一个数组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]。不能使用除法。样例输入:[1, 2, 3, 4, 5]输出:[120, 60, 40, 30, 24]思考题:能不能只使用常数空间?(除了输出的数组之外)问题分析此题...原创 2019-05-13 17:08:31 · 117 阅读 · 0 评论 -
AcWing 83. 股票的最大利润
题目描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖一次该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为[9, 11, 8, 5, 7, 12, 16, 14]。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。样例输入:[9, 11, 8, 5, 7, 12, 16, 14]输出:11问题分析从前往后遍历...原创 2019-05-13 17:08:19 · 169 阅读 · 0 评论 -
AcWing 79. 滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组[2, 3, 4, 2, 6, 2, 5, 1]及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为[4, 4, 6, 6, 6, 5]。注意:数据保证k大于0,且k小于等于数组长度。样例输入:[2, 3, 4, 2, 6, 2, 5, 1] , k=3输出: [4, 4,...原创 2019-05-13 17:07:54 · 124 阅读 · 0 评论 -
AcWing 77. 翻转单词顺序
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。样例输入:"I am a student."输出:"student. a am I"问题分析此题分为三个步骤。1. 先将字符串中的多余空格都去掉,将字符串变为首...原创 2019-05-13 17:07:42 · 142 阅读 · 0 评论 -
AcWing 75. 和为S的两个数字
题目描述输入一个数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。你可以认为每组输入中都至少含有一组满足条件的输出。样例输入:[1,2,3,4] , sum=7输出:[3,4]问题分析从nums数组起始点开始,检查target减去当前数的差是否在哈希表中,如果在就说明已经找到了,返回结果即可;如果不在则将当前...原创 2019-05-12 12:13:18 · 98 阅读 · 0 评论 -
AcWing 74. 数组中唯一只出现一次的数字
题目描述在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。你可以假设满足条件的数字一定存在。思考题:如果要求只使用O(n) 的时间和额外O(1) 的空间,该怎么做呢?样例输入:[1,1,1,2,2,2,3,4,4,4]输出:3问题分析先将数组中的所有元素的最后一位加起来,然后对3求余,如果为0说明答案的最后一位是...原创 2019-05-12 12:13:06 · 148 阅读 · 0 评论 -
AcWing 72. 平衡二叉树
题目描述输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。注意:规定空树也是一棵平衡二叉树。样例输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示, 5 / \ 7 11 / \ 12 9输出:tr...原创 2019-05-12 12:10:29 · 102 阅读 · 0 评论 -
AcWing 71. 二叉树的深度
题目描述输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。样例输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4输出:3问题分析二叉...原创 2019-05-12 12:10:17 · 116 阅读 · 0 评论 -
AcWing 34. 链表中环的入口结点
题目描述给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。样例给定如上所示的链表:[1, 2, 3, 4, 5, 6]2注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.问题分析先等慢指针和快指针相遇,然后快指针原地不动,将慢指针置为head,然后两个指针以相同...原创 2019-05-10 12:15:50 · 771 阅读 · 0 评论 -
AcWing 80. 骰子的点数
题目描述将一个骰子投掷n次,获得的总点数为s,s的可能范围为n~6n。掷出某一点数,可能有多种掷法,例如投掷2次,掷出3点,共有[1,2],[2,1]两种掷法。请求出投掷n次,掷出n~6n点分别有多少种掷法。样例1输入:n=1输出:[1, 1, 1, 1, 1, 1]解释:投掷1次,可能出现的点数为1-6,共计6种。每种点数都只有1种掷法。所以输出[1, 1, 1, ...原创 2019-05-07 16:29:21 · 222 阅读 · 0 评论 -
AcWing 61. 最长不含重复字符的子字符串
题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。样例输入:"abcabc"输出:3问题分析定义两个指针 i 和 j ,分别指向当前不包含重复字符的子字符串的起始字符和结尾字符。用哈希map保存当前不包含重复字符的子字符串中的字符的个数。j 从0开始遍历字符串,将遍历到的字符在哈希map中...原创 2019-05-06 23:43:57 · 129 阅读 · 0 评论