剑指Offer
文章平均质量分 95
昂昂累世士
这个作者很懒,什么都没留下…
展开
-
AcWing 88 树中两个结点的最低公共祖先
题目描述:给出一个二叉树,输入两个树节点,求它们的最低公共祖先。一个树节点的祖先节点包括它本身。注意:输入的二叉树不为空; 输入的两个节点一定不为空,且是二叉树中的节点;样例二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4...原创 2019-03-18 20:28:39 · 203 阅读 · 0 评论 -
AcWing 41 包含min函数的栈
题目描述:设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 getMin()–得到栈中最小元素样例MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);minSt...原创 2019-03-08 08:41:04 · 155 阅读 · 0 评论 -
AcWing 76 和为S的连续正数序列
题目描述:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。样例输入:15输出:[[1,2,3,4,5],[4,5,6],[7,8]]分析:我们知道,设i为连续序列的第一个元素,j为连续序列的最后一个元素。比如上例,第一个解i=1,j=5...原创 2019-03-15 15:24:15 · 135 阅读 · 0 评论 -
AcWing 75 和为S的两个数字
题目描述:输入一个数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。你可以认为每组输入中都至少含有一组满足条件的输出。样例输入:[1,2,3,4] , sum=7输出:[3,4]分析:方法一:排序+双指针,时间复杂度为O(nlogn)。class Solution {public: vecto...原创 2019-03-15 11:08:18 · 168 阅读 · 0 评论 -
AcWing 74 数组中唯一只出现一次的数字
题目描述:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。你可以假设满足条件的数字一定存在。思考题:如果要求只使用 O(n)的时间和额外 O(1)的空间,该怎么做呢?样例输入:[1,1,1,2,2,2,3,4,4,4]输出:3分析:方法一:统计各位1出现的次数。我们知道,如果没有那个出现了一次的数,其他数字都出现了三次...原创 2019-03-15 10:42:08 · 182 阅读 · 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]分析:方法一:首先当模拟题暴力模拟一遍,锻炼下思维。class Solution {public: vec...原创 2019-03-07 17:27:11 · 152 阅读 · 0 评论 -
AcWing 58 把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。样例输入:[3, 32, 321]输出:321323注意:输出数字的格式为字符串分析:分析一下样例,3,32,321,最高位相同,则比较次位,次位为空,比如3,则可将次位都视为...原创 2019-03-10 19:32:48 · 134 阅读 · 0 评论 -
AcWing 57 数字序列中某一位的数字
题目描述:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。样例输入:13输出:1分析:判断序列第n位数是什么,首先要知道第n位属于几位数的第几位,这个多位数又是什么?我们知道,一位数0-9共10个,两位数10-99共9...原创 2019-03-10 17:21:46 · 150 阅读 · 0 评论 -
AcWing 56 从1到n整数中1出现的次数
题目描述:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含“1”的数字有1,10,11和12,其中“1”一共出现了5次。样例输入: 12输出: 5分析:直接枚举n个数,复杂度太高。现在比如51023,对于第一个数5 > 1,若最高位是1,有10000-19999共10000种情况;第二个数就是1,左边数是0-...原创 2019-03-10 15:27:29 · 136 阅读 · 0 评论 -
AcWing 73 数组中只出现一次的两个数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。你可以假设这两个数字一定存在。样例输入:[1,2,3,3,4,4]输出:[1,2]分析:方法一:采用哈希表,时间和空间复杂度均为O(n)。class Solution {public: vector<int> findNumsAppear...原创 2019-03-14 17:08:22 · 140 阅读 · 0 评论 -
AcWing 72 平衡二叉树
题目描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。注意:规定空树也是一棵平衡二叉树。样例输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示, 5 / \ 7 11 / \ 12 9输出:t...原创 2019-03-14 16:40:23 · 142 阅读 · 0 评论 -
AcWing 71 二叉树的深度
题目描述:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。样例输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4输出:3分析:写求...原创 2019-03-14 16:29:49 · 243 阅读 · 0 评论 -
AcWing 55 连续子数组的最大和
题目描述:输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18分析:本题作为动态规划的经典题,在紫书上高效算法设计第一节便给出了各种复杂度的解法。暴力法:枚举部分和起点,终点以及求...原创 2019-03-10 11:19:40 · 227 阅读 · 0 评论 -
AcWing 54 数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。样例输入:1, 2, 3, 4输出:1,1.5,2,2.5解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。分析:维护一个大根堆和一个小根堆,大根堆存...原创 2019-03-10 10:37:06 · 158 阅读 · 0 评论 -
AcWing 53 最小的k个数
题目描述:输入n个整数,找出其中最小的k个数。注意:数据保证k一定小于等于输入数组的长度; 输出数组内元素请按从小到大顺序排序;样例输入:[1,2,3,4,5,6,7,8] , k=4输出:[1,2,3,4]分析:大根堆的经典应用。维护一个大根堆,遍历向量时将元素加入大根堆。一旦大根堆元素个数超过了k,立刻删除堆顶元素,直至遍历到最后一个元素。class...原创 2019-03-10 10:04:12 · 596 阅读 · 0 评论 -
AcWing 52 数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,并且一定存在满足条件的数字。样例输入:[1,2,1,1,3]输出:1分析:有趣的问题。采用两个变量存储中间状态,val表示可能的解,cnt表示其出现的次数。初始val取第一个数,cnt为1;继续向后扫描,如果扫到的元素值与val相等,则cnt++;否则判断cnt是否为0,是则val...原创 2019-03-10 09:48:12 · 165 阅读 · 0 评论 -
AcWing 51 数字排列
题目描述:输入一组数字(可能包含重复数字),输出其所有的排列方式。样例输入:[1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]分析:本题与普通的全排列问题的不同之处在于...原创 2019-03-10 09:25:26 · 371 阅读 · 0 评论 -
AcWing 70 二叉搜索树的第k个结点
题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。你可以假设树和k都存在,并且1≤k≤树的总结点数。样例输入:root = [2, 1, 3, null, null, null, null] ,k = 3 2 / \ 1 3输出:3分析:模拟二叉树中序遍历过程,依次访问LNR,访问N的语句替换为k--即可。当k到达0时,找到答案,递归不...原创 2019-03-14 16:19:12 · 109 阅读 · 0 评论 -
AcWing 77 翻转单词顺序
题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。样例输入:"I am a student."输出:"student. a am I"分析:本题类似于将一个数组前k个数平移到末尾的问题,该问题分为两步:先将前...原创 2019-03-15 15:41:49 · 150 阅读 · 0 评论 -
AcWing 78 左旋转字符串
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。注意:数据保证n小于等于输入字符串的长度。样例输入:"abcdefg" , n=2输出:"cdefgab"分析:和上题一样的思路,简单的问题。cl...原创 2019-03-15 15:48:26 · 173 阅读 · 0 评论 -
AcWing 61 最长不含重复字符的子字符串
题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。样例输入:"abcabc"输出:3分析:双指针法,第一个指针i从头开始遍历,同时将哈希表的值++,一旦遇见重复的,则从j开始遍历,同时哈希表值--,直到遍历到重复的那个值位置,j为该位置++,重复上述过程。这一方法与数组连续子序列最大和有...原创 2019-03-13 19:22:27 · 152 阅读 · 0 评论 -
AcWing 87 把字符串转换成整数
题目描述:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。样例输入:"123"输出:123注意:你的函数应满足下列条件:忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数; 整数后可能有任意非数字字符,请将其忽略; 如果...原创 2019-03-18 19:48:41 · 152 阅读 · 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-03-18 18:56:42 · 134 阅读 · 0 评论 -
AcWing 60 礼物的最大价值
题目描述:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?注意:m,n>0样例:输入:[ [2,3,1], [1,7,1], [4,6,1]]输出:19解释:沿...原创 2019-03-13 16:06:16 · 153 阅读 · 0 评论 -
AcWing 85 不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。样例输入:num1 = 1 , num2 = 2输出:3分析:我们在对两个二进制数做加法的时候,相当于先对各位做异或运算,然后如果对应位是两个1,则需要进位,对应于&运算。所以求两个数的和可以分解为先求对应位的异或结果再求对应位的与结果,将与结果左移一位得到carry...原创 2019-03-18 17:28:40 · 113 阅读 · 0 评论 -
AcWing 84 求1+2+…+n
题目描述:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。样例输入:10输出:55分析:利用&&短路的性质来修改递归函数。class Solution {public: int getSum(int n) { int ans = n; ...原创 2019-03-18 17:02:12 · 149 阅读 · 0 评论 -
AcWing 83 股票的最大利润
题目描述:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖 一次 该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为[9, 11, 8, 5, 7, 12, 16, 14]。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。样例输入:[9, 11, 8, 5, 7, 12, 16, 14]输出:11分析:暴力的方法是...原创 2019-03-18 16:50:50 · 257 阅读 · 0 评论 -
AcWing 59 把数字翻译成字符串
题目描述:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。样例输入:"12258"输出:5...原创 2019-03-13 15:44:05 · 180 阅读 · 0 评论 -
AcWing 82 圆圈中最后剩下的数字
题目描述:0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。样例输入:n=5 , m=3输出:3分析:本题为经典的约瑟夫问题。方法一:直接模拟模拟删除的过程做懒惰删除,最后剩下的那个数即是所求的数。(不推荐,时间空间都消耗不少,可能还不如直接用链表模拟的好。)当然也...原创 2019-03-18 16:32:15 · 167 阅读 · 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-03-18 15:02:39 · 399 阅读 · 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, 1, ...原创 2019-03-18 10:33:01 · 189 阅读 · 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-03-18 09:03:03 · 286 阅读 · 0 评论 -
AcWing 46 二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。样例输入:[4, 8, 6, 12, 16, 14, 10]输出:true分析:分析下BST后序遍历的性质,比如4,8,6,12,16,14,10。毫无疑问10是根结点,由于是BST,左子树严格小于根结点严格小...原创 2019-03-08 12:51:01 · 218 阅读 · 0 评论 -
AcWing 45 之字形打印二叉树
题目描述:请实现一个函数按照之字形顺序从上向下打印二叉树。即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null] 8 / \ 12 2 / \ 6 4输出...原创 2019-03-08 11:51:10 · 163 阅读 · 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-03-08 11:04:58 · 104 阅读 · 0 评论 -
AcWing 43 不分行从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4输出:[8, 12, 2, 6, 4]分析:要求输出层序遍历序列,所以使用BFS...原创 2019-03-08 10:22:17 · 169 阅读 · 0 评论 -
AcWing 42 栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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]输出:true分析:...原创 2019-03-08 10:08:10 · 146 阅读 · 0 评论 -
AcWing 69 数组中数值和下标相等的元素
题目描述:假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组[-3, -1, 1, 3, 5]中,数字3和它的下标相等。样例输入:[-3, -1, 1, 3, 5]输出:3注意:如果不存在,则返回-1。分析:简单的二分问题。class Solution {public: ...原创 2019-03-14 15:59:13 · 156 阅读 · 0 评论 -
AcWing 68 0到n-1中缺失的数字
题目描述:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。样例输入:[0,1,2,4]输出:3分析:二分法。经常会出现的问题是边界情况以及出现死循环或者各种细节没处理好导致错误。边界情况一般是元素个数为0或者1的情况。对于本题,如果向量为空,则说明...原创 2019-03-14 15:34:14 · 177 阅读 · 0 评论 -
AcWing 23 矩阵中的路径
题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空; 所有出现的字符均为大写英文字母;样例matrix=[ ["A","B","C","E"], ...原创 2019-03-04 09:12:22 · 145 阅读 · 0 评论