![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
《剑指Offer》C++版
《剑指Offer》C++版
杨小帆_
沉下心来做技术
展开
-
《剑指Offer》54. 数组中只出现一次的数字
题目:53. 数组中只出现一次的数字知识点:位异或运算题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解题思路:之前做过一道数组中只有一个数字出现一次,其余数字都出现两次的题,那道题直接利用异或的性质就可以很简单的解决了。这道的题的解题关键是对于那道题的一个进一步拓展,如果再对这个数组进行异或的话最后的结果肯定是不为零...原创 2019-03-13 20:40:51 · 107 阅读 · 0 评论 -
《剑指Offer》5. 用两个栈实现队列
题目:5. 用两个栈实现队列知识点:队列、栈题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路:解法一和解法二的思路是相同的,都是通过一个栈先将入栈的元素进行保存,当需要取元素的时候,将当前栈中的元素都入栈到另一个栈中,这样此时之前数列的顺序就被颠倒,再从另一个栈中出栈的时候,元素的顺序就已经符合队列的顺序了。代码:...原创 2019-02-14 11:07:30 · 104 阅读 · 0 评论 -
《剑指Offer》4. 重建二叉树
题目:4. 重建二叉树知识点:二叉树题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路:两种解法的解题思路是相同的,只不过实现方式不同,解法一是通过数组下标进行实现,而解法二是...原创 2019-02-14 10:02:25 · 119 阅读 · 0 评论 -
《剑指Offer》52. 矩阵中的路径
题目:52. 矩阵中的路径知识点:回溯算法题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcce...原创 2019-02-24 22:35:18 · 92 阅读 · 0 评论 -
《剑指Offer》3. 从尾到头打印列表
题目:3. 从尾到头打印列表知识点:链表题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路:解法一:我是采用了先扫描一遍列表,获取链表的长度,然后直接创建固定大小的数组,然后再第二遍扫描数组的同时,将结点值从后向前插入数组中即可,注意解法一和解法二、解法三的要求有些不同,解法一需要将调转后的链表的结点值存储在数组中返回,而后两个解法是不需要的。...原创 2019-02-13 22:55:10 · 136 阅读 · 0 评论 -
《剑指Offer》2. 替换空格
题目:2. 替换空格知识点:字符串题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路:解法一是我自己最开始写的代码,代码的鲁棒性不是太好,没有进行数组越界的检测,然后命名也存在一些问题,但是总体思路是和解法二、解法三相同的,总体的思路类似于双指针思想,都...原创 2019-02-13 22:19:06 · 98 阅读 · 0 评论 -
《剑指Offer》1. 二维数组中的查找
题目:二维数组中的查找知识点:查找题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:这里有三种解法,分别是我自己写出的比较烂的一种,书中的一种,还有牛客网提供的一种。解法一:我利用二位数组从上到下,从左到右都是递增...原创 2019-02-13 20:59:45 · 170 阅读 · 0 评论 -
《剑指Offer》51. 二叉搜索树的第k个结点
题目:51. 二叉搜索树的第k个结点知识点:二叉搜索树题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解题思路:解法一和解法二的思路是一样的,即利用二叉搜索树中序遍历的结果为升序数列,只需通过中序遍历,同时对结点进行计数就可以了。代码://解法一(自研): Tree...原创 2019-02-24 20:44:45 · 201 阅读 · 0 评论 -
《剑指Offer》50. 序列化二叉树
题目:50. 序列化二叉树知识点:二叉树题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。解题思路:就这道题来说,三种解法的思路都是一样的,都是通过前序遍历来序列化二叉树,之后再通过递归来反序列化二叉树。但是根据代码量其实很容易看出来,因为 C++ 的操作涉及指针,所以不论是代码量还是代码的复杂程度都超过 JAVA。代码://解法一(剑指Offer):voi...原创 2019-02-24 20:20:06 · 171 阅读 · 0 评论 -
《剑指Offer》49. 孩子们的游戏(圆圈中最后剩下的数)
题目:49. 孩子们的游戏(圆圈中最后剩下的数)知识点:数学优化题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回...原创 2019-02-24 19:30:44 · 327 阅读 · 0 评论 -
《剑指Offer》30. 连续子数组的最大和
题目:30. 连续子数组的最大和知识点:动态规划题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第...原创 2019-02-18 21:31:46 · 123 阅读 · 0 评论 -
《剑指Offer》29. 最小的k个数
题目:29. 最小的k个数知识点:数组题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路:解法一:很普通的解法,时间复杂度为 O(nlogn),就是排序之后求前k个数。解法二:基于Partition 快排解法,即不断地进行快排,是最终的快排完成后的下标为 k-1 ,这时位于数组左边的 ...原创 2019-02-18 21:25:40 · 94 阅读 · 0 评论 -
《剑指Offer》6. 旋转数组的最小数字
题目:6. 旋转数组的最小数字知识点:查找题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路:解题两种思路,但是总的来说思路是差不多的,...原创 2019-02-14 11:38:41 · 108 阅读 · 0 评论 -
《剑指Offer》7. 斐波那契数列
题目:7. 斐波那契数列知识点:递归、动态规划题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路:思路比较简单,动态规划和递归递归都可以实现,不做过多赘述。代码://解法一(自研): int Fibonacci(int n) { vect...原创 2019-02-14 11:46:36 · 197 阅读 · 0 评论 -
《剑指Offer》8. 跳台阶
题目:8. 跳台阶知识点:动态规划题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路:跟前一题的思路一模一样,不做赘述。代码://解法一(自研): int jumpFloor(int number) { vector<int> d...原创 2019-02-14 11:58:51 · 95 阅读 · 0 评论 -
《剑指Offer》53. 滑动窗口的最大值
题目:53. 滑动窗口的最大值知识点:双端开口队列题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2019-03-13 20:14:02 · 99 阅读 · 0 评论 -
《剑指Offer》55. 机器人的运动范围
题目:55. 机器人的运动范围知识点:回溯算法题目描述:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到...原创 2019-03-15 19:40:29 · 104 阅读 · 0 评论 -
《剑指Offer》37. 平衡二叉树
题目:37. 平衡二叉树知识点:二叉树题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。解题思路:解法一:遍历树的每个节点时,调用函数来计算其左、右子数的深度,如果左、右子树的深度相差都不超过 1 ,那么按照定义它就是一棵二叉树,但是这种解法中每个节点要被计算两次深度,算法的复杂度较高,不是很理想。解法二:使用后序遍历的方式对二叉树进行遍历,这样在我们遍历完某个节点的...原创 2019-02-20 19:44:36 · 95 阅读 · 0 评论 -
《剑指Offer》36. 二叉树的深度
题目:36. 二叉树的深度知识点:二叉树题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路:思路简单,没啥好说的,一行代码搞定。代码://解法一(自研): int TreeDepth(TreeNode* pRoot) { return pRoot =...原创 2019-02-20 19:15:38 · 83 阅读 · 0 评论 -
《剑指Offer》35. 和为S的连续正数序列
题目:35. 和为S的连续正数序列知识点:双指针题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Goo...原创 2019-02-20 12:14:53 · 77 阅读 · 0 评论 -
《剑指Offer》34. 和为S的两个数字
题目:34. 和为S的两个数字知识点:双指针题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解题思路:双指针解法,思路清晰简单,不做赘述。代码://解法一(自研): vector<int> FindNumbersWithSum(vector<int>...原创 2019-02-20 11:32:21 · 119 阅读 · 0 评论 -
《剑指Offer》33. 第一个只出现一次的字符
题目:33. 第一个只出现一次的字符知识点:优化、哈希表题目描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。解题思路:解题的思路比较简单,直接使用哈希表就可以了,即使用哈希表保存每个字符出现的次数,只需要通过两次扫描就可以解决问题,第一次扫描字符串记录每个字符...原创 2019-02-20 11:19:25 · 80 阅读 · 0 评论 -
《剑指Offer》32. 丑数
题目:32. 丑数知识点:优化、三指针、动态规划题目描述:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路:比较直观的解法就是直接对每一个数字都进行遍历判断,优化之后的解题思路是使用三指针+类似于动态规划的思想,即创建一个记录数组,对之前...原创 2019-02-20 11:03:00 · 145 阅读 · 0 评论 -
《剑指Offer》31. 整数中1出现的次数
题目:31. 整数中1出现的次数知识点:优化题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解题思路:解...原创 2019-02-20 10:02:00 · 102 阅读 · 0 评论 -
《剑指Offer》10. 矩形覆盖
题目:10. 矩形覆盖知识点:动态规划题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路:因为每个小矩形的覆盖方式只有横放和竖放两种方式,当横放时相当于取 N-2 时的覆盖方式,竖放时相当于取 N-1 时的覆盖方式,所以通过动态规划思想解决就可以了,思路和代码与斐波那契数列大体一致,...原创 2019-02-14 12:24:56 · 156 阅读 · 0 评论 -
《剑指Offer》9. 变态跳台阶
题目:9. 变态跳台阶知识点:动态规划题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:跟前一题的思路一模一样,不做赘述。代码://解法一(自研): int jumpFloorII(int number) { vector<int> dp(number...原创 2019-02-14 12:12:53 · 150 阅读 · 0 评论 -
《剑指Offer》28. 数组中出现次数超过一半的数字
题目:28. 数组中出现次数超过一半的数字知识点:数组题目详情:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路:解法一:我自己写出的代码,总体来说效率较低,时间复杂度较高,就是通过排序后再进行统计查找。解...原创 2019-02-18 21:00:19 · 138 阅读 · 0 评论 -
《剑指Offer》48. 构建乘积数组
题目:48. 构建乘积数组知识点:数组题目描述:给定一个数组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]。不能使用除法。解题思路:解法一:通过分析结果的乘积数组是由两部分构成,第一部分是当前元素的前面所有元素的乘积,第二部分是当前元素后面所有元素的乘...原创 2019-02-23 18:40:16 · 81 阅读 · 0 评论 -
《剑指Offer》47. 数组中重复的数字
题目:47. 数组中重复的数字知识点:哈希表题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路:这道题的解法很像前面一道链表的题,解法比较简单的就...原创 2019-02-23 17:50:42 · 106 阅读 · 0 评论 -
《剑指Offer》39. 数字在排序数组中出现的次数
题目:39. 数字在排序数组中出现的次数知识点:二分查找题目描述:统计一个数字在排序数组中出现的次数。解题思路:解法一:先通过二分查找,确定连续的目标数字中的任意一个,然后通过循环来对其左右分别进行扫描,找到和目标数字相同的数字则次数加一,但这种解法的时间复杂度较高,为 O(n)。解法二:这种解法的主要思想也是利用二分法来不断缩小区间来定位目标值的下标,只是这种解法定位的下...原创 2019-02-21 22:29:41 · 107 阅读 · 0 评论 -
《剑指Offer》38. 两个链表的第一个公共结点
题目:38. 两个链表的第一个公共结点知识点:链表题目描述:输入两个链表,找出它们的第一个公共结点。解题思路:解题思路的关键是两个链表的长度可能不相同,那么就无法同时同步的对两个链表进行比较,但是其实不管两个两个链表的长度如何,其最后的末尾部分一定是公共的部分,因此我们的解决方法是可以先遍历两个链表得出其各自的长度,然后计算出它俩的差值,然后让长链表上的指针先走差值步,将两个链...原创 2019-02-21 20:42:04 · 100 阅读 · 0 评论 -
《剑指Offer》20. 包含min函数的栈
题目:20. 包含min函数的栈知识点:栈题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路:解题的思路比较简单,使用一个辅助栈即可,栈顶始终为当前的栈中的最小元素,当入栈时,如果入栈小于辅助栈栈顶元素,则将入栈元素同时入入辅助栈,否则默认将辅助栈栈的元素再次入栈。需要注意的是,当辅助栈为空时,也应将入主栈的...原创 2019-02-16 10:38:52 · 160 阅读 · 0 评论 -
《剑指Offer》19. 顺时针打印矩阵
题目:19. 顺时针打印矩阵知识点:数组题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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。解题思路:题目是比较简单的,但是需要细致耐心的进行分析,不然...原创 2019-02-16 10:16:15 · 229 阅读 · 0 评论 -
《剑指Offer》18. 二叉树的镜像
题目:18. 二叉树的镜像知识点:二叉树题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ /...原创 2019-02-15 20:35:57 · 102 阅读 · 0 评论 -
《剑指Offer》17. 树的子结构
题目:17. 树的子结构知识点:二叉树题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路:解法一和解法二的解题思路是一样的,即将解题分为两个部分,第一个部分是递归地遍历树每一个的每一个结点,第二部是以每一个结点作为根节点,递归地判断以当前结点为根节点的子树是否与给定的 B 树相等。代码://解法一(自研): ...原创 2019-02-15 20:13:32 · 144 阅读 · 0 评论 -
《剑指Offer》16. 合并两个排序的链表
题目:16. 合并两个排序的链表知识点:鲁棒性题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路:解法一:使用循环实现,即首先排除特殊情况(两个链表同时为空,或其中之一为空),其次同时对两个链表进行遍历,将值较小的结点接到输出链表末尾即可。解法二:使用递归实现,当我们得到两个链表中值较小的头结点并把它链接到已经合并...原创 2019-02-15 14:58:16 · 195 阅读 · 0 评论 -
《剑指Offer》15. 反转链表
题目:15. 反转链表知识点:鲁棒性题目描述:输入一个链表,反转链表后,输出新链表的表头。解题思路:思路比较简单,解法一和解法二是一致的,使用双指针即可解决,需要注意的是对特殊的输入情况的处理。代码://解法一(自研): ListNode* ReverseList(ListNode* pHead) { if(pHead == ...原创 2019-02-15 12:40:42 · 226 阅读 · 0 评论 -
《剑指Offer》14. 链表中倒数第k个结点
题目:14. 链表中倒数第k个结点知识点:链表、鲁棒性题目描述:输入一个链表,输出该链表中倒数第k个结点。解题思路:解题的思路比较简单,解法一和解法二都是通过双指针的方法来进行解题的,需要注意的是对一些错误输入的处理,比如:(1)输入的 pListNode 为空指针;(2)输入的以 pListNode 为头结点的链表的结点总数少于 k ;(3)输入的参数 k 为 0...原创 2019-02-15 12:08:41 · 138 阅读 · 0 评论 -
《剑指Offer》13. 调整数组顺序使奇数位于偶数前面
题目:13. 调整数组顺序使奇数位于偶数前面知识点:数组题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路:解法一:这是我自己写出的解法,是针对于这道题目来说,因为我也想到了解法二的这种双指针的解法,但是很快就被排除掉了,因为这道题的要求中有一...原创 2019-02-15 10:56:55 · 175 阅读 · 0 评论 -
《剑指Offer》12. 数值的整数次方
题目:12. 数值的整数次方知识点:细节题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路:这道题解法二没什么说的,就是直接连乘就完事儿了,解法一和解法三的思路是相同的,究其原理是每个乘方都可以分解为两个乘方相乘,当这个乘方的指数为偶数 2n 时,则其恰好可以分解为 n + n,也就是 a^2n = ...原创 2019-02-14 23:20:56 · 154 阅读 · 0 评论