
剑指offer
刷题笔记
qq_34405786
这个作者很懒,什么都没留下…
展开
-
13、机器人运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路回溯法C++代码实现int movingCount(int threshold, int rows, int cols) {原创 2020-06-06 20:18:05 · 159 阅读 · 0 评论 -
12、矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。思路利用回溯法解决任选一个格子作为路径的起点,假设矩阵中某个格子为ch,并且这个格子对应路径原创 2020-06-06 20:04:39 · 149 阅读 · 0 评论 -
11、旋转数组中的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:直接遍历、或者用sort函数排序后返回第一个元素,能返回正确的结果,但是没有利用旋转数组的特性,故不符合要求。可使用二分查找,能使用二分查找的前提是选取中间值后,可以顺利的找到待查找元素所在的区间(进而缩小原创 2020-05-13 12:48:06 · 124 阅读 · 0 评论 -
10、斐波那契数列
题目一:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39题目二:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。题目三:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目四:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,原创 2020-05-12 21:50:00 · 241 阅读 · 0 评论 -
41、数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路从数据流中读到数字,有多中数据结构储存,所以对应多种解决方法,有不同的时间复杂度。数据结构...原创 2020-04-26 12:11:08 · 122 阅读 · 0 评论 -
54、二叉搜索树的第K个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路二叉搜索树的中序遍历序列是一个从小到大的有序序列,故二叉搜索树第k(大、小)个结点问题,就是中序遍历二叉搜索树,对序列结果对应输出第K个有递归和非递归两种遍历方式,可看作遍历+按条件输出结点。C++实现/****递归遍历,将结果...原创 2020-04-26 11:17:40 · 156 阅读 · 0 评论 -
37、序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺...原创 2020-04-26 10:55:38 · 124 阅读 · 0 评论 -
32、从上到下打印二叉树(层序遍历)
题目题目一:不分行从上到下打印二叉树题目二:分行从上到下打印二叉树(每一层打印到一行)题目三:之字形打印二叉树(第一行从左到右,第二行从右到左,......)思路二叉树的层序遍历本质上就是广度优先搜索(BFS),题目二、三无非就是输出格式上添加一些细节限制。广度优先搜索的基本套路:无论遍历一幅有向图还是一棵树,都要用到队列。 首先把起始节点(对树而言是根节...原创 2020-04-19 23:20:30 · 125 阅读 · 0 评论 -
28、对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路前序遍历是:先遍历父结点,在遍历左结点,在遍历右结点;定义对称前序遍历:先遍历父结点,在遍历右结点,在遍历左结点。得到的就是二叉树镜像的前序遍历序列。只需要比较两种遍历序列就可以判断二叉树是否对称。C++代码实现 bool isSymmetric...原创 2020-04-19 22:19:36 · 93 阅读 · 0 评论 -
27、二叉树的镜像
题目请完成一个函数,输入一棵二叉树,该函数输出它的镜像。思路先前序遍历这棵树的每个节点,如果遍历到的节点有子结点,就交换它的两个子结点。当交换完所有的非叶节点的左、右子节点之后,就得到了树的镜像。C++实现void MirrorRecuriverly(TreeNode* pNode){ if(pNode == nullptr) return; ...原创 2020-04-19 22:03:35 · 85 阅读 · 0 评论 -
8、二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路1、若该结点有右子树,则右子树的最左结点是要找的下一个结点;2、若该结点没有右子树,则检查父结点,若为父结点的左子结点,则父结点为要找的下一个结点;若为父结点的右子结点,则指向父结点的指针向上遍历,直到找到一个结点是其父结点的左子结点,则...原创 2020-04-16 11:39:38 · 89 阅读 · 0 评论 -
7、重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路1、前序遍历序列的第一个元素是根结点root;2、遍历中序遍历序列,找到根结点root的位置,分割序列,root前面的序列为左子树序列,...原创 2020-04-15 23:50:20 · 154 阅读 · 0 评论 -
6、从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路思路一:“从未到头”输出 = “后入先出” 栈,建立一个栈,遍历链表压入栈,再弹出思路二:递归打印下一个结点;递归的实质就是栈思路三: 调用库函数,1、vertor自带函数,头插insert(res.begin(),val)(好像效率不高);2、尾插push_back(),再用reverse()反转...原创 2020-04-15 22:25:21 · 220 阅读 · 1 评论 -
23、链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路思路一:暴力法,用数组记录遍历过的结点,容易想到。缺点:时间复杂度为O(),需要额外的数组。 ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode * res = NULL; ListNode *...原创 2020-04-14 23:07:48 · 144 阅读 · 0 评论 -
18、删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路当前结点与下一(或多个)结点值相等,则删除这些结点。遍历直到p = NULL 或者p->next = NULL。需解决问题:(1)如何删除当前...原创 2020-04-14 12:12:43 · 76 阅读 · 0 评论 -
19、正则表达式的匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配方法分析:一个字符匹配情况:字符串中的字符 = 模式中的字符 字符串中的字符 ...原创 2020-04-06 10:26:36 · 84 阅读 · 0 评论 -
5、替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。方法一:遇到一个空格,将后面的字符向后移动两次,插入‘%’,‘2’,‘0’。时间复杂度为O()。方法二:遍历一次字符串,统计出空格的个数,计算出替换后字符串的长度。设置两个指针p1和p2,p1指向原始字符串末尾,p2指向替...原创 2020-04-04 21:41:28 · 103 阅读 · 0 评论 -
66、构建乘积数组
题目描述给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)方法一:暴力解决,n-1个元...原创 2020-03-30 22:17:07 · 110 阅读 · 0 评论 -
3.数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。方法一:哈希法1、原数组中的所有元素是在0~n-1范围内的,所以可以构造大小为n的数组,下标表示原数组中的每个元素...原创 2020-03-29 23:05:35 · 117 阅读 · 0 评论 -
4、二维数组的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。方法一:暴力查找:逐个查找,或者逐行查找,每一行再二分查找。class Solution {public: bool Find(int target, vector<ve...原创 2020-03-25 00:00:01 · 79 阅读 · 0 评论 -
30.包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。分析:第一反应对栈内元素排序,把最小元素放在栈顶,但出栈操作不能保证“后入先出”。该方案不行。第二,栈内增加一个成员变量记录当前栈的最小元素,问题:当栈内最小元素弹出后,这个成员变量...原创 2020-03-22 12:08:54 · 88 阅读 · 0 评论 -
59.滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2020-03-22 00:36:34 · 84 阅读 · 0 评论