剑指offer
草帽小子Coder
这个作者很懒,什么都没留下…
展开
-
滑动窗口的最大值
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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],...原创 2019-06-12 12:05:24 · 7113 阅读 · 5 评论 -
数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。思路:有多种思路,第一、采用哈希表的方式,虽然时间复杂度是O(1),但是还是空间复杂度为O(n),第二、采用异或的方法,使用异或,当只有一个数字只出现一次的时候,对整个数组异或运算,最后的结果肯定是这个只出现一次的数字(因为相同的数字异或都为零了),因为这里只有两个数不相同的,在...原创 2019-05-31 13:48:36 · 146 阅读 · 0 评论 -
平衡二叉树
题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:(后续遍历)使用深度优先搜索的后续遍历的的方法,因为后续遍历的遍历顺序是左右根的访问顺序,所以对于每个节点,首先判断子树是否是平衡二叉树,如果子树是平衡二叉树,记录此时该子树的深度(用于与其他子树后续其他的判断),如果不是则整个二叉树就不是平衡二叉树,下面使用递归的方式遍历。代码:class solution...原创 2019-05-31 10:56:27 · 143 阅读 · 0 评论 -
对称二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:使用递归与非递归两种方法实现该函数,递归法肯定要判断左子结点的的左子结点值与右子节点的右子节点值是否相等,左子结点的右子节点值与右子节点的左子结点值是否相等,当存在有两者都不为空时也满足对称,当只有其中一个为空或者两者都不为空的情况下值不相同则不满足对称,递...原创 2019-06-05 12:06:19 · 173 阅读 · 0 评论 -
二叉树的下一个结点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:看该节点是否存在右节点,如果存在右节点,则下一个节点是该节点的右节点的最左子节点(从该右节点一直往左子结点遍历),直到没有左子结点为止。 如果不存在右节点,则分为两种情况,看该节点是其父节点的左子结点还是右子节点:如果是左子结点的...原创 2019-06-05 10:16:25 · 130 阅读 · 0 评论 -
二分法搜索与哈希表
二分法搜索与哈希表的使用在寻找排序数组中的某一个数字的时候可以使用二分法与哈希表的方式,哈希表时间复杂度是o(1),但是空间复杂度增大了,需要把所有存入哈希表内,而二分法就比较简单了,只需要进行折半查找。哈希表:从头到尾遍历每个数据,存入哈希表,下表当做key,数组中的值当做value,直接搜索就能求得位置。二分法:比如数组M[n]中0~n-1的数据,寻找m,第一次搜索看M[(...原创 2019-05-30 16:20:49 · 609 阅读 · 0 评论 -
二叉树的深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:此题大体思路和前面博客二叉树中和为某一值的路径基本一致,借助于栈,把访问到的数据保存在栈中,当到达某一叶子节点时,计算栈中的数据个数,并与最大值比较,求得最大值,当二叉树所有节点访问结束便能求得二叉树的深度。struct TreeNode...原创 2019-05-30 11:31:33 · 169 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解读:经过仔细分析可以知道,如果要该数字出现的次数超过数组长度的一半,则等价于目标数字出现的次数大于其它数字出现的总和,比如题目中的2是出现次数超过一半的,如果删除...原创 2019-05-18 11:28:32 · 278 阅读 · 0 评论 -
把数组排成最小的数
题目描述:题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:这里还是很类似于冒泡排序的思想,进行排序,往后挨个遍历,不过这里不是比较两个数的大小,而是把两个数都变成字符串,如a和b,组成ab和ba两个字符串,再进行比较ab和ba中数据的大小,更小...原创 2019-05-23 10:20:50 · 135 阅读 · 0 评论 -
字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。解读:这道题用递归最方便,里面用到了冒泡排序中思想,如abcd,a的位置冒泡移动变成bacd、cbad、dbca,而对于第一种中除a之外的bcd同样进行相同的操作,对b进行冒泡移动,cbd,dcb,而...原创 2019-05-17 21:35:13 · 186 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解读:(前序遍历)如下图所示,遍历这颗二叉树,输入整数为16,一看就知道有两个路径8、7、1和8、8、0,那么怎么实现这样的自动遍历呢,首先是肯定从根节点开始遍历,那么就会...原创 2019-05-13 13:11:37 · 128 阅读 · 0 评论 -
数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路:第一种思路即是最普通的方式,从头到尾挨个遍历数组,没遍历到一个元素,再挨个遍历该元素后面的所有元素,将比该元素小的所有元素的所有情况计数。 归并排序的方法,这种思路...原创 2019-05-25 17:16:52 · 162 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。要求时间复杂度为O(n)。思路:这里首先想到的思路就是从头到尾挨个遍历元素,,继续把后面元素判断一遍,如果后面没有相同的元素,那么该元素就是第一个只出现一次的元素。 第二种思路就是利用哈希表的方式,对每个元素计数,这里的计数其实是哈希表的Value,遍历到相同的Key,Value肯定会累...原创 2019-05-25 00:02:30 · 118 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述:输入两个链表,找出它们的公共节点思路两个链表若有公共节点,那么在公共节点之后的一部分两个链表的节点是一样的,那么在公共节点之前,两个链表的前半段之差就是两个整链表之差,所以先求出两个链表之差d,先遍历长一些的链表d个节点,然后从此时遍历到的节点同时也遍历短一些的链表,直到遍历到两个链表值相等时就是公共节点。代码:class solution{ public: ...原创 2019-05-28 21:56:12 · 106 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目描述:统计一个数字在排序数组中出现的次数。思路:最基本的思路就是根据排序数组的特点进行二分法定位,定位会出出现的情况时,K可能是第一个,可能是中间某一位置,也可能在最后一个,所以定位到K后,再往左边遍历直到不为K为止,再从定位位置往右遍历直到不为K为止,这样就能计算出K的总数,除此之外,还有加强版的二分法直接定位到K的边界位置,即第一个或者最后一个K的位置,这样就能直接往一个方向遍...原创 2019-05-28 23:44:07 · 138 阅读 · 0 评论 -
删除链表中重复的结点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。思路:设置两个节点指针,一个pCur记录当前节点,一个pNext记录当前节点后面的一个节点(遇到重复节点才用到),如果当前节点pCur的值与pCur-...原创 2019-06-04 22:27:39 · 128 阅读 · 0 评论 -
二叉搜索树的第K个节点
题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:基于搜索二叉树的中序遍历可以按顺序从小到大遍历到每个节点,因此当通过中序遍历遍历到第k个节点就是第k小的节点。代码(递归):class solution{ public: TreeNode* result=NULL; ...原创 2019-06-11 10:59:03 · 124 阅读 · 0 评论 -
八大排序算法
八大排序:目录八大排序:冒泡排序直接插入排序希尔排序快速排序简单选择排序堆排序归并排序基数排序冒泡排序排序过程:从第一个往后进行相邻元素遍历,如果前一个元素大于后一个元素,则交换两者的位置,遍历完一轮就能确定最后一个元素为该次遍历总长度的最大值,而且每遍历一轮,下次遍历的元素个数减1,所以对于n个元素的数组,遍历n-1轮完成排序过程,第一轮确定n...原创 2019-06-15 17:43:51 · 266 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。思路:两种思路:哈希表,建立哈希表,输入字符,记录字符,把每个字符都遍历到,对每个字符出现的次数计数,遍历完后就能依据哈希表知道首先仅出现次数为1的字符。 ...原创 2019-06-03 15:56:52 · 109 阅读 · 0 评论 -
把字符串转换成整数
题目描述:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。注意:字符串数字之前可能包括空格和正负号。思路:需要注意的是可能包括正负号和空格,以及后面值得大小范围,首先必须要遍历到数字开始的位置,该位置之前一个位置一定会...原创 2019-06-03 14:05:18 · 339 阅读 · 0 评论 -
数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:两种思路:利用哈希表,不过这样空间复杂度为O(n),虽然时间复杂度为O(1),先遍历所有元素,存入...原创 2019-06-03 13:32:19 · 100 阅读 · 0 评论 -
序列化二叉树
题目描述:使用任意一种遍历算法将二叉树拼成一个字符串,NULL指针用符号代替。思路:使用前序遍历,中序遍历,后续遍历都能正常转换,关于深度遍历已经详细阐述,但是为空的地方(有的树没有左或者右子树),用符号代替,对于反序列化,要将一个字符串转换为一个二叉树,对应的特殊字符在二叉树中代表为空,首先要将前面二叉树转换成的字符串中的!去除,在遍历去除!后的字符串时,当遇到#(前面二叉树中为...原创 2019-06-07 14:54:17 · 117 阅读 · 0 评论 -
翻转单词顺序列
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:和前...原创 2019-06-01 21:33:12 · 152 阅读 · 0 评论 -
把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:这里 思路类似于前面的一篇从上往下打印二叉树,都是从上往下,从左到右的思路,最主要的方法就是利用队列,把数据推入队列中,可以使用两个队列,也可以使用一个队列,使用两个队列,一个出数据(压入到容器),一个进数据(出数据的左右子树,每出一个,推入相应的左右子树),当其中一个空了,互换两个队列的进出顺序,使用...原创 2019-06-06 23:07:19 · 106 阅读 · 0 评论 -
左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:这里用到的还是对字符串翻转,相当于镜像的位置互换,这里是往左移动n个位置,同...原创 2019-06-01 17:59:37 · 109 阅读 · 0 评论 -
和为S的连续正数序列
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路:思路1:从第一个1为首...原创 2019-06-01 13:53:04 · 109 阅读 · 0 评论 -
和为S的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路:思路1:利用哈希表的方法,先遍历每个数据,建立映射,再从头开始看hash[S-data[i]]是否为零,不为零就存在这个数,用完一次要减1,因为可能存在相同的数据,与此同时记录最小值,一直到遍历结束。思路2:利用排序的特点,从两...原创 2019-06-01 11:06:06 · 168 阅读 · 0 评论 -
丑数
题目描述:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:丑数的定义是对于一个数,依次被2、5、3整除完后如果能得到商是1,那么这个数即为丑数,下面通过遍历的方法来判断如果这个数能被2整除,除到不能整除为止,判断除完后是否商为1,如果为1...原创 2019-05-24 14:52:29 · 468 阅读 · 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的个数,可以按照...原创 2019-05-20 13:26:55 · 193 阅读 · 0 评论 -
栈的压入弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解读:(借助于辅助栈)1入栈,栈顶1!=4,继续入栈 2入栈,1,2...原创 2019-04-23 11:22:21 · 177 阅读 · 0 评论 -
包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中调用push、pop、top、min的时间复杂度都是o(1)。解读:(借助于辅助栈)这里要再定义一个辅助栈,用来存放每次入栈时的最小元素,这样两个栈同时压入数据,数据栈数据正常数据压入和弹出,辅助栈压入数据的时候,要看压入的数据是否大于辅助栈的栈顶数据(如果大于栈顶数据,则复制此时辅助栈栈顶...原创 2019-04-27 10:59:13 · 99 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解读:此题用STL容器方法非常简单,把奇数和偶数分别按顺序放在两个容器中,遍历完后,把偶数插入奇数容器末尾即可代码 :class solution{ public: void fun...原创 2019-04-23 09:35:24 · 114 阅读 · 0 评论 -
数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解读:代码:class solution{ public: //在不考虑输入参数为错误情况下,如底数base为零,指数exponent为负数 double function(double base ,int exponent) {...原创 2019-04-23 09:14:45 · 77 阅读 · 0 评论 -
替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。注:"a"和’a’的区别,前者是字符串,后者是字符。注:当每次遍历到一个空字符的时,要将空格后面的所有字符都往后移动两个位置,同时再将%20三个字符插入到遍历到的位置开始到往后两个位置为止 插入完后,要将下一次的遍历位置加2,字符串...原创 2019-04-18 11:27:24 · 92 阅读 · 0 评论 -
二维数组查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。class solution{ public bool Find(int target, vector<vector<int> > array){ int ro...原创 2019-04-18 10:54:46 · 131 阅读 · 0 评论 -
顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.解读:如下图的一个遍历顺序,从外到内进行遍历,每次遍历的m和n都会增加1,见程序中描述,所以根据矩阵...原创 2019-04-26 14:04:11 · 109 阅读 · 0 评论 -
求出任意数中二进制1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解读:方式1:数据按位往右移动,每移动一次,和1求&运算,直到数据为0,停止运算求出来1的总个数,对于正数是可以求出,但是对于负数就不可行,因为负数右移的话左边补1,这样最后等所有数据移位结束了,全是1,会一直死循环下去。 方式2:将一个无符号数据flag=1按位往左移动,每移动一次将数据与fla...原创 2019-04-22 10:41:27 · 138 阅读 · 0 评论 -
矩阵覆盖
题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?题目解读:此题其实仍然是个斐波拉契数列问题,借助于这位博主图片一用,解释如下:代码:class Solution{ public: int rectCover(int number) { ...原创 2019-04-22 09:34:10 · 227 阅读 · 0 评论 -
跳台阶问题
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。题目解读:其实就是一个简单的的斐波拉契数列问题,可以总结出如下规律:n=1时,共有1中跳法n=2时,共有2中跳法n=3时,共有3中跳法n=4时,共有5中跳法n=5时,共有8中跳法...........可以总结出上面的规律是一个...原创 2019-04-22 08:58:47 · 85 阅读 · 0 评论 -
合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目解读:首先判断两个链表,如果存在两个链表中有一个为空链表,则输出另外一个链表。 定义两个节点,P1和P2,其中P1负责保存最后的链表输出数据,P2负责移动位置 一直比较两个链表的头节点的值,当遍历到其中一个链表的尾端时,再把另一个链表接上去,使用这篇博主的图片解释如下,讲的很形...原创 2019-04-21 14:27:52 · 333 阅读 · 0 评论