![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
涛涛酱
北邮研究僧在读
展开
-
【剑指offer】二叉树问题总结
总结的挺好的,常拿出来看看。。。。https://juejin.im/post/5b8d64346fb9a01a1d4f99fa原创 2020-04-12 11:59:46 · 96 阅读 · 0 评论 -
【剑指 offer】反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路和指针有关的问题,要注意判断边界条件和特殊样例。可以用递归和非递归两种方式。注意解除原链表头节点的nxt关系,否则会死循环。代码递归:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }...原创 2019-12-02 11:23:03 · 61 阅读 · 0 评论 -
【剑指 offer】序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树思路:二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! ...原创 2019-04-22 20:39:28 · 91 阅读 · 0 评论 -
【剑指 offer】二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:二叉搜索树(Binary Search Tree,BST)又称二叉排序树、二叉查找树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;(2)若右子树不空,则右...原创 2019-04-16 21:41:43 · 81 阅读 · 0 评论 -
【剑指 offer】从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:bfs。先序遍历二叉树,把节点加入到队列当中,出队时打印该节点的值。和剑指offer的[把二叉树打印成多行] 思路相同。还不用换行。。。(https://blog.csdn.net/iCode_girl/article/details/88372146)代码:struct TreeNode { int val; ...原创 2019-04-16 17:35:35 · 78 阅读 · 0 评论 -
【剑指 offer】连续子数组的最大和
题目描述:给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)。例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。思路:维护一个数组dp[],dp[i]表示到i位置且包含a[i]的连续子向量的最大和。如果dp[i-1]<0,重新开始序列,否则和之前的dp值相加。先用数据来尝试解决这个问题,然后再考虑...原创 2019-04-13 11:41:53 · 78 阅读 · 0 评论 -
【剑指 offer】字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路:dfs。确定一个位置的字符后,把当前位置字符和后面的字符依次交换。相同的字符不交换,最后产生的排列就是没有重复的了。代码:class Solution {public: vector<...原创 2019-04-16 14:42:23 · 62 阅读 · 0 评论 -
【剑指 offer】整数中1出现的次数
题目描述:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:从个位、十位、百位…各个位置上1出现的规律来解。代码:class...原创 2019-04-12 17:04:08 · 127 阅读 · 0 评论 -
【剑指 offer】数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。题目保证输入的数组中没有的相同的数字。数据范围:对于%50的数据,size<=10^4;对于%75的数据,size<=10^5;对于%100的数据,size<...原创 2019-04-09 14:24:35 · 197 阅读 · 0 评论 -
【剑指 offer】数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:用一个key值记录数组中的数字,然后用一个value记录该数字出现的次数,然后累加:继续遍历余下的所有数字,如果和这个数字相等,就把次数加1;如果和这个数字不等,那么就...原创 2019-04-15 20:59:24 · 74 阅读 · 0 评论 -
【剑指 offer】把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:定义排序方法,str1+str2 > str2 + str1,则str1 > str2。代码:class Solution {public: string to_string(...原创 2019-04-11 11:06:07 · 82 阅读 · 0 评论 -
【剑指 offer】用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈1是入队的栈,当需要pop时,把栈1倒进栈2,取栈顶元素。只有需要pop且栈2为空时,才倒进去。代码:class Solution{public: void push(int node) { stack1.push(node); } int ...原创 2019-04-25 19:52:07 · 71 阅读 · 0 评论 -
【剑指 offer】二叉树中和为某一值的路径
题目描述:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:路径是从根节点到叶子结点的。dfs。对结果按照要求排序。代码:struct TreeNode { int val; struct TreeNode *left; st...原创 2019-04-17 19:31:42 · 72 阅读 · 0 评论 -
【剑指 offer】栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:模拟出栈。以前写的时候好像用数组模拟就可以。现在用的vector。。哎。。。...原创 2019-04-25 09:13:37 · 74 阅读 · 0 评论 -
【剑指 offer】数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:因为所有数字都限制在0到n-1范围内,所以就调整数组中数字正好一个萝卜一个坑。代码:class Soluti...原创 2019-04-24 14:50:26 · 83 阅读 · 0 评论 -
【剑指 offer】复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:…不太懂这个不要用引用的要求。疯狂返回空,好像是不用random的复制和引用?代码:struct RandomListNode { int label;...原创 2019-04-19 11:01:13 · 96 阅读 · 0 评论 -
【剑指 offer】字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。思路:字符流:像流水一样的字符,一去不复返,意味着只能访问一次。在插入字符时,记录当前字符出现的次数,可以用长度为12...原创 2019-04-23 18:57:18 · 104 阅读 · 0 评论 -
【剑指 offer】二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:中序遍历。版本1不知道为什么提交上去反馈死循环,样例也没有找到不对的。版本2.。。是真的精辟。。。版本1:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;...原创 2019-04-18 17:23:22 · 80 阅读 · 0 评论 -
【剑指 offer】数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方3 法获取当前读取数据的中位数。思路:对于数据流,对应的就是在线算法了,一道很经典的题目就是在1亿个数中找到最大的前100个数,这...原创 2019-04-23 14:32:38 · 84 阅读 · 0 评论 -
【剑指 offer】扑克牌顺子
题目描述:大小王看作0,判断是否是顺子。思路:间隔数少于等于0的个数。代码:class Solution {public: bool IsContinuous( vector<int> numbers ) { if (numbers.empty()) return false; sort(numbers.begin(), number...原创 2019-04-27 17:17:54 · 86 阅读 · 0 评论 -
【剑指 offer】包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:用一个辅助栈,保存当前栈内的最小元素。每次入栈前判断当前的最小元素是原来的还是新进的。代码:class Solution {public: void push(int value) { num.push(value); if (m...原创 2019-04-27 16:46:53 · 71 阅读 · 0 评论 -
【剑指 offer】数字在排序数组中出现的次数
题目描述:统计一个数字在数组中出现的次数。思路:二分查找数组中第一次出现数字k的位置。代码:class Solution {public: int GetNumberOfK(vector<int> data, int k) { if (data.empty()) return 0; int len = data.size(); ...原创 2019-04-07 18:24:48 · 61 阅读 · 0 评论 -
【剑指 offer】平衡二叉树
题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:是空树或者左右子树高度差不超过1,并且左右子树都是平衡二叉树。代码:class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if (pRoot == NULL) return true; ...原创 2019-04-07 10:52:57 · 77 阅读 · 0 评论 -
【剑指 offer】丑数
题目描述:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:只对丑数进行操作,为了避免重复,记录上一次*2, *3,*5得到丑数的位置。代码:class Solution {public: int GetUglyNumber_Solution...原创 2019-04-10 19:34:52 · 96 阅读 · 0 评论 -
【剑指 offer】链表中环的入口结点
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:判断是否存在环:使用追赶的方法,设定两个指针,均从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,遇到NULL。找入口:当fast指针等于slow指针时,slow指针肯定还没有遍历完整个链表,而此时fast指针已经在环内循环了n圈(n&gt;=1),假定从链表头指针开始s...原创 2019-03-10 21:22:21 · 68 阅读 · 0 评论 -
【剑指 offer】删除链表中重复的节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1-&gt;2-&gt;3-&gt;3-&gt;4-&gt;4-&gt;5 处理后为 1-&gt;2-&gt;5。思路:先写了一个非递归版,对链表遍历一遍可以解决。先找到头节点,然后对当前节点和前一个、后一个节点的值比较,如果不同,可以加入。写完发现。嚯,别原创 2019-03-10 20:00:39 · 89 阅读 · 0 评论 -
【剑指 offer】二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:有如下几种情况:如果一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。如果没有右子树,且它是父节点的左子节点,那么它的下一个节点就是它的父节点。如果一个节点即没有右子树,并且它还是父节点的右子节点,这种情况比较复杂。我们...原创 2019-03-10 16:43:04 · 84 阅读 · 0 评论 -
【剑指 offer】对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:二叉树和它的镜像相同,判断其为对称的。思路1: 先序遍历,和先序遍历的对称(根、右、左)比较,考虑到一个节点无法区分,把第一层NULL节点加进去了。并不知道出了什么bug。暂且放这。struct TreeNode { int val; struct...原创 2019-03-10 10:45:26 · 79 阅读 · 0 评论 -
【剑指 offer】把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:对二叉树广搜,打印当前节点的时候,先把其子节点加入到队尾。用两个变量分别表示当前层还未打印节点数量和下层节点数量控制每层一行输出。代码:class Solution {public: vector&lt;vector&lt;int&gt; &gt; Print(TreeNode* pRoot) {...原创 2019-03-09 21:58:35 · 71 阅读 · 0 评论 -
【剑指 offer】二叉搜索树的第K个节点
题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:二叉搜索树的中序遍历是有序的,所以返回中序遍历的第k个节点即可。代码:递归版:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r...原创 2019-03-09 16:58:59 · 95 阅读 · 0 评论 -
【剑指 offer】滑动窗口的最大值
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2019-03-09 15:19:04 · 67 阅读 · 0 评论 -
【剑指 offer】机器人的运动范围
题目描述:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:dfs回溯。代码:class ...原创 2019-03-08 21:03:34 · 57 阅读 · 0 评论 -
【剑指 offer】二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:先想到的是对当前整数不断的和1做按&amp;运算,可以判断最右边位置是不是1,然后整数右移,重复操作。误区: 输入数字为负的时候,右移时在左边补充的1,一直右移,最后数字会变成0xFFFFFFFF而陷入死循环。那,然后想到把1左移,不断和输入数字按位&amp;,这样循环32次,可以判断完成。注意应该是uin...原创 2019-03-08 16:32:10 · 71 阅读 · 0 评论 -
【剑指 offer】正则表达式匹配
题目描述:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。思路:开始试图在一次遍历里,各种if判断,最后发现还是递归大法好。。。一个样例:bbbbb...原创 2019-03-11 15:56:13 · 77 阅读 · 0 评论 -
【剑指 offer】和为S的连续正数序列
题目描述:找到所有和为S的连续整数序列,序列长度>=2思路:滑动窗口,维护序列的最小值和最大值。如果当前序列和大于sum,最小值向右移动,反之,最大值向右移动。好像还有很多解法。。代码:class Solution {public: vector<vector<int> > FindContinuousSequence(int sum) { ...原创 2019-03-20 09:41:04 · 81 阅读 · 0 评论 -
【剑指 offer】数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:如果数组中只有一个只出现一次的数字,所有数字的异或结果就是要找的数字。现在有两个只出现一次的数字,所有数字的异或结果其实就是这两个数字的异或。按照结果的第一个数字1的位置把所有数字分成两个数组。分别异或,即找到两个数字。代码:class Solution {public: ...原创 2019-03-27 16:07:17 · 81 阅读 · 0 评论 -
【剑指 offer】反转单词顺序列
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:两次翻转。先翻...原创 2019-03-24 09:43:30 · 91 阅读 · 0 评论 -
【剑指 offer】孩子们的游戏
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后...原创 2019-03-26 10:11:19 · 97 阅读 · 0 评论 -
【剑指 offer】顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.思路:emmm…注意不要打重喽。(陕西口音buff)代码:class Solution {public: ...原创 2019-03-17 19:35:13 · 108 阅读 · 0 评论 -
【剑指 offer】求1+2+3+...+n
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:递归,短路。代码:class Solution {public: int Sum_Solution(int n) { int ans = n; ans && (ans += Su...原创 2019-03-12 17:30:47 · 87 阅读 · 0 评论