
剑指Offer
feng_zhiyu
这个作者很懒,什么都没留下…
展开
-
【剑指Offer】和为S的连续正数序列
题目链接 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述: 输出所有和为S的连续正...原创 2018-11-30 23:06:16 · 331 阅读 · 0 评论 -
剑指Offer题解【Python版】【LintCode】
个人博客:枫之羽 《剑指Offer》 说明:题目顺序和LintCode中的顺序相同。 目录 9. Fizz Buzz 问题 366. 斐波纳契数列 204. 单例 212. 空格替换 365. 二进制中有多少个1 35. 翻转链表 159. 寻找旋转排序数组中的最小值 73. 前序遍历和中序遍历树构造二叉树 40. 用栈实现队列 38. 搜索二维矩阵 II 111. 爬...原创 2018-09-14 12:07:14 · 1194 阅读 · 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. 思路:以当前是第几圈为基准,顺时针打印 代码: class Solution { public:...原创 2018-09-01 10:58:29 · 262 阅读 · 0 评论 -
【剑指Offer】包含min函数的栈
题目链接 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路:题目要求时间复杂度为O(1),这里需要采用辅助栈st2,维护st2是从大到小的栈(从底端到顶端),min()返回顶端元素即是题目所求。 ps:两个栈的长度是否一样不影响。 代码: class Solution { public: stack<...原创 2018-09-01 10:58:33 · 282 阅读 · 0 评论 -
【剑指Offer】不用加减乘除做加法(位运算)
题目链接 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 思路:位运算符 两个数异或(^):相当于每一位相加,而不考虑进位; 两个数相与(&),并左移一位:相当于求得进位; 将上述两步的结果相加 代码【非递归】: class Solution { public: int Add(int num1, int num2) ...原创 2018-08-28 12:02:04 · 314 阅读 · 0 评论 -
【剑指Offer】求1+2+3+...+n(逻辑运算和位运算)
题目链接 题目描述 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 思路:虽然是简单的求和公式n*(n+1)/2,但是必须满足以上的条件。 【1】递归,不能使用if等条件判断语句,可以使用&&逻辑运算符的短路特性实现。 【2】利用sizeof(a)计算bool数组的字节数,bo...原创 2018-08-28 12:01:56 · 938 阅读 · 0 评论 -
【剑指Offer】连续子数组的最大和
题目链接 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的...原创 2018-08-28 12:01:39 · 294 阅读 · 0 评论 -
【剑指Offer】最小的K个数
题目链接 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路: 【1】快速排序 【2】堆排序(优先队列实现最小堆) ps:注意k>n的情况 代码【1】: class Solution { public: vector<int> GetLeastNumbers_Solu...原创 2018-08-28 12:01:09 · 403 阅读 · 0 评论 -
【剑指Offer】数组中出现次数超过一半的数字
题目链接 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路: 一、使用map计数,超过一半就输出该值。空间复杂度O(n) class Solution { public: int MoreThan...原创 2018-08-27 02:24:01 · 268 阅读 · 0 评论 -
【剑指Offer】数组中重复的数字
题目链接 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 分析: 1. 使用访问标记数组vis,初始化为false,第一次出现true的即为重复数字 clas...原创 2018-10-03 19:59:12 · 259 阅读 · 0 评论 -
【剑指Offer】第一个只出现一次的字符
题目链接 题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 分析:简单计数并记录字符对应的位置 class Solution { public: int FirstNotRepeatingChar(string str) { int cnt[...原创 2018-10-03 20:49:43 · 279 阅读 · 0 评论 -
【剑指Offer】栈的压入、弹出序列
题目链接 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 分析:出栈的序列 不可能出现 “大小中”的三个连续的数,以此判断。 注...原创 2018-10-03 20:48:06 · 279 阅读 · 0 评论 -
【剑指Offer】和为S的两个数字
题目链接 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 分析: 数组递增,两数和为定值时,要使两数乘积最小,所以顺序查找,第一组和为S的两个数即为所求。 时间复杂度O(nlog(n)) class Solution { public: ve...原创 2018-11-30 23:05:51 · 328 阅读 · 0 评论 -
【剑指Offer】二叉树的深度
题目链接 题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 分析:递归即可。当然也可以写成非递归的形式 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(...原创 2018-09-27 21:59:29 · 571 阅读 · 1 评论 -
【剑指Offer】把数组排成最小的数
题目链接 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 分析:拼接乘最小数字,不能是比较数字的大小,例如:3<32<321,但是结果是由321 32 3拼接得到。所以应该比较拼接后的大小。 在此基础上,可以考虑减小空间复杂度,如果卡内存,...原创 2018-09-27 21:58:58 · 360 阅读 · 1 评论 -
【剑指Offer】数组中只出现一次的数字
题目链接 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。 分析:之前做过简单一些的 数组中只有一个数字出现奇数次,明显可以通过异或运算求得。 那么有个数两只出现一次。思想也是异或运算。先求出所有整数的异或和,求得的结果sum表示两个数不同的二进制位。sum最多有2个二进制位为1,其他都为0。那么接下来求得第一个1所在的位置。 第三个...原创 2018-09-27 21:58:20 · 370 阅读 · 1 评论 -
【剑指Offer】二叉树中和为某一值的路径
题目链接 题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 分析:递归。 不过我想到的还需要排序,因为要使数组长度大的数组靠前 /* struct TreeNode { int val; struct Tree...原创 2018-10-03 20:49:24 · 305 阅读 · 0 评论 -
【剑指Offer】树的子结构
题目链接 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路: 例如图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。 要查找树A中是否存在和树B结构一样的子树,可以分成两步: 第一步在树A中找到和B的根节点的值一样的结点R; 第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。 第一...原创 2018-08-27 00:33:06 · 290 阅读 · 0 评论 -
【剑指Offer】合并两个排序的链表
题目链接 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路:边比较大小,边移动链表指针,两种写法:递归,非递归 代码【非递归】: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { ...原创 2018-08-27 00:32:12 · 299 阅读 · 0 评论 -
【剑指Offer】反转链表
题目链接 题目描述 输入一个链表,反转链表后,输出新链表的表头。 思路:链表反转最少要保存前后两个节点pre,next,详解见代码 代码: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { p...原创 2018-08-27 00:31:04 · 357 阅读 · 0 评论 -
【剑指Offer】用两个栈实现队列(栈、队列)
题目链接题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:入队两个数据结构没有什么区别,出队不一样,根据栈(LIFO)和队列(FIFO)的性质,可以知道出队是将栈1的底部元素出队,所以将所有元素压入另外一个栈(必须是空,若不为空,栈顶元素即为队列的出队元素),然后弹出栈顶元素。代码:class Solution { public: void ...原创 2018-07-02 15:27:16 · 270 阅读 · 0 评论 -
【剑指Offer】二叉搜索树的后序遍历序列(递归/非递归)
代码【递归】:class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.empty()) { return false; } int len=sequence.size(); //...原创 2018-07-01 20:42:17 · 556 阅读 · 0 评论 -
【剑指Offer】从上往下打印二叉树(输出层序遍历序列,bfs)
题目链接题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:bfs代码:/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Soluti...原创 2018-07-01 20:03:59 · 644 阅读 · 0 评论 -
【剑指Offer】对称的二叉树(递归)
题目链接题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:判断二叉树是否对称,也就是比较左右子树是否对称,那么递归比较左右子树即可。代码:/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; T...原创 2018-07-01 19:52:23 · 546 阅读 · 0 评论 -
【剑指Offer】二叉树的镜像(递归)
题目链接题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路:若...原创 2018-07-01 19:41:55 · 342 阅读 · 0 评论 -
【剑指Offer】重建二叉树(已知前序序列和中序序列,重建二叉树)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二叉树遍历方式:前序序列:先访问根节点,再访问左子节点,最后访问右子节点。中序序列:先访问左子节点,再访问根节点,最后访问右子节点。后序序列:先访问左子节点...原创 2018-07-01 18:48:30 · 1374 阅读 · 0 评论 -
【剑指Offer】从尾到头打印链表(C++,栈/递归)
题目描述 输入一个链表,从尾到头打印链表每个节点的值。 思路:从尾到头打印,符合后进先出,用栈存储,然后存入vector.O(n) 另外,递归本质也是栈结构,所以也可以用递归写。 代码【栈】: /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x...原创 2018-06-29 21:42:00 · 905 阅读 · 0 评论 -
【剑指Offer】替换空格(C++,两次遍历)
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 class Solution { public: void replaceSpace(char *str,int length) { int cnt=0; for(int i=0; i&amp;amp;amp;amp;lt...原创 2018-06-29 21:24:34 · 372 阅读 · 0 评论 -
【剑指Offer】旋转数组的最小数字(二分/遍历)
题目链接题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:遍历代码:class Solution { public: int minNumberInR...原创 2018-07-02 15:31:58 · 354 阅读 · 0 评论 -
【剑指Offer】斐波那契数列(递归,DP)
题目链接题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39思路:这是一个众所周知的问题,第一想法是什么?递归,迭代,矩阵快速幂,动规?有很多解法,这里给出两种的。递归和动规。 在讨论区中看到大佬写的动规。资源消耗很少。矩阵快速幂理论上更快。资源消耗:739 ms472K代码【递归版】:class Solution { public: in...原创 2018-07-02 15:46:33 · 804 阅读 · 0 评论 -
【剑指Offer】变态跳台阶(推导)
题目链接题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:写过,答案就出来了。1<<(n-1)写一下分析。青蛙一次可以跳上1,2,……,n级。f(1)=1;f(2)=f(2-1)+f(2-2);//对于二级台阶,f(2-1)为一次跳1级的次数;f(2-2)为一次跳2级的次数 后面类似f(3)=f(3-1)+f...原创 2018-07-02 16:14:36 · 399 阅读 · 0 评论 -
【剑指Offer】链表中倒数第k个结点
题目链接 题目描述 输入一个链表,输出该链表中倒数第k个结点。 思路: 【1】因为是倒数第k个,可以利用栈的LIFO的性质,先用栈保存,再输出。 时间复杂度O(n+k),空间复杂度O(n*2) 【2】设置两个指针first,second,first先走k次next,若链表长度小于k,则first=nullptr,直接返回nullptr;反之,则可以到达,则进行第二次指针移动,第二次是fi...原创 2018-08-27 00:30:14 · 301 阅读 · 0 评论 -
【剑指Offer】调整数组顺序使奇数位于偶数前面
题目链接 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 思路: 【1】容易想到的是新开辟一个vector,先放奇数,后放偶数 【2】类似冒泡排序思想,如果时前偶后奇的情况交换 【3】STL的stable_partition()函数,类似【1】 代码【1...原创 2018-08-27 00:29:01 · 273 阅读 · 0 评论 -
【剑指Offer】数值的整数次方(快速幂运算)
题目链接 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路: 【1】a^b。注意b可以为负数,循环计算输出 【2】a^b优化,快速幂运算。 【3】cmath头文件的pow(double,double) 代码【1】: class Solution { public: double Power(do...原创 2018-08-27 00:28:05 · 716 阅读 · 0 评论 -
【剑指Offer】二进制中1的个数(位运算)
题目链接 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路: 【1】二进制数1的个数,容易想到BIT中lowbit。 n&(-n)表示一个数的最右边的1代表的数 【2】无符号右移运算符>>>,右移位时高位补0(无论原来的数是正是负)。java中可以直接使用,C++可以先转化unsigned int,再使用>>。ps:此...原创 2018-08-27 00:17:00 · 294 阅读 · 0 评论 -
剑指Offer题解
个人博客:枫之羽 github源码地址:剑指Offer——github地址 题目 题解链接 备注 二维数组中的查找 题解 顺序遍历 替换空格 题解 两次遍历 从尾到头打印链表 题解 栈,递归 重建二叉树 题解 二叉树遍历,递归 二叉树的镜像 题解 递归 对称的二叉树 题解 递归 从上...原创 2018-07-01 18:56:29 · 1965 阅读 · 0 评论 -
【剑指Offer】矩形覆盖(公式推导)
题目链接 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 【1】根据前几项1,2,3,5,8,13,……推出公式:f(n)=f(n-1)+f(n-2),n>=3 ; f(n)=n,n<3 【2】画图推导公式 当n>=3时,2*n 由 2*(n-1) 和 2*(n-2...原创 2018-08-27 00:17:31 · 716 阅读 · 0 评论 -
【剑指Offer】二叉树的深度 (递归/非递归)
题目链接题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:经过一个节点,深度+1,递归;非递归代码【递归版】:/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : v...原创 2018-07-06 11:22:39 · 534 阅读 · 0 评论 -
【剑指Offer】跳台阶(DP)
题目链接题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:根据题意分析,对于n>2,每一阶有2种跳法,所以f(n)=f(n-1)+f(n-2),n>2,这不就是斐波那契数列吗,所以直接写。分析请见:【剑指Offer】斐波那契数列(递归,DP)。ps:输出不同。代码:class Solution { public: int j...原创 2018-07-02 15:55:34 · 472 阅读 · 0 评论 -
【剑指Offer】二维数组中的查找(C++,顺序遍历)
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 代码: class Solution { public: bool Find(int target, vector&amp;lt;vector&amp;lt;int&amp;gt; &amp;gt; array) { int...原创 2018-06-29 21:07:11 · 456 阅读 · 0 评论