剑指Offer
坚持每天至少一道题,保质保量,多种方法,多个角度,GOGOGO!
EWilsen
talk is cheap cheap cheap cheap,show show show me the code.
展开
-
剑指offer第三十七题数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解题方案1.排序数组可以直接使用二分查找,统计次数,但是比较慢2.STL中的一些库函数代码Python版本和开挂一样 return data.count(k)实现了这些二分查找的两个版本lower_bound,upper_bound,直接调用就好了。O(log n)class Solution {p...原创 2018-09-07 16:22:01 · 271 阅读 · 0 评论 -
剑指offer第一题二维数组中的查找问
[题目描述]:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。【分析】:首先要会用C++实现一个二维数组并且理解行和列,然后分析题目,题目中最重要的信息时行和列都在对应的方向上递增,这样就可以按照对角线查找元素。构建题目框架只需判断是不是整数则明显返回TRUE和FALSE,方法一因...原创 2018-03-16 08:56:42 · 209 阅读 · 0 评论 -
剑指offer第二题替换字符串
[题目描述]:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。【分析】:拿到这道题首先想到的是用C++可以直接判断str中的空格替换为%20后return str就行了,写了一下出错了,突然想到Python有replace函数,可以直接替换字符串,所以先提交一个Python的版本过过瘾。然后在...原创 2018-03-17 01:09:50 · 290 阅读 · 0 评论 -
剑指offer第三题打印链表
[题目描述]:输入一个链表,从尾到头打印链表每个节点的值。【分析】:链表的打印,可以使用栈。可以使用递归。栈的方法:class Solution {public: vector<int> printListFromTailToHead(ListNode* head) { stack<int> st;/*定义一个人空栈*/ while...原创 2018-03-22 01:27:23 · 232 阅读 · 0 评论 -
剑指offer第四题重建二叉树
【题目描述】:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。【题目分析】:二叉树的遍历中已知中序和任意一个都可以得到唯一的二叉树,在二叉树的前序遍历中,第一个数字总是根节点。中序遍历中根节点在中间,两边为整颗大...原创 2018-03-27 17:21:45 · 273 阅读 · 0 评论 -
剑指offer第五题两个栈实现队列功能
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。【题目分析】:这个题目其实算是一道简单题,只要有数据结构理论的,完全可以理解整个过程,其核心思想就是两个栈,一个用来push原始进入,类似仓库的功能,仓库的元素按照栈的规则存放入货架,再从货架pop元素就可以了,这个题有一个知识盲点,就是为什么每次执行完就要将元素pop一下,其实就是保证当前循环的正常进行和...原创 2018-03-30 00:40:47 · 181 阅读 · 0 评论 -
剑指offer第六题数组旋转
写在前面,1.这是我目前遇到最有趣的题目涵盖多种思路,多种解法,也是多种问题。故记录下来总结一下。半夜看到这道题,首先想到的是二分,后来一看最小,那不是直接遍历就行,但是T=O(n)。2.左神的课程中提到过,对于二分搜索,一般大家都是mid=(left+right)/2,其实在数组特别大的时候会出现越界,故写成mid=left+(right-left)/2,这个是不一样的【题目描述】:把一个数组最...原创 2018-04-01 01:53:44 · 659 阅读 · 0 评论 -
剑指offer第七题斐波那契数列
【题目分析】:求斐波那契数列第n项,n<=39;思路上来就怼了递归。然后GG,明显内存超了。然后用循环和动态规划。直接递归直接GGclass Solution {public: int Fibonacci(int n) { if(n<=2) return 1; else return Fibonacci(...原创 2018-04-05 00:34:23 · 473 阅读 · 1 评论 -
剑指offer第八题跳台阶
【问题描述】:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。【思路】:就是类似斐波那契数列。递归思想内存占用过大。class Solution {public: int jumpFloor(int n) { if(n=0) return 0; return jumpFloor(n-1)+jump...原创 2018-04-08 00:51:11 · 221 阅读 · 0 评论 -
剑指offer第九题变态跳台阶
这道题我觉得不能单独作为一篇博客,但是想想思想更加重要。题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目分析关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:f(1) = 1f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。f(3) = f(3-1) + f(3-2...原创 2018-04-09 00:35:38 · 210 阅读 · 0 评论 -
剑指offer第十题矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路分析走过的弯路:开始只是简单地将 n 分成奇、偶讨论,并将 2*2 作为基本单元。测试后通不过,代码就不贴出来献丑了。思路分析:痛定思痛,还是不能够贪小便宜。用归纳法归纳如下,(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。(...原创 2018-04-09 01:00:58 · 217 阅读 · 0 评论 -
剑指offer第十一题二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路分析:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1...原创 2018-04-09 01:20:15 · 175 阅读 · 0 评论 -
剑指offer第十二题数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路分析第一种方法:使用递归,时间复杂度O(logn)当n为偶数,a^n =(a^n/2)*(a^n/2)当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a举例:2^11 = 2^1 * 2^2 * 2^82^1011 = 2^0001 * 2^00...原创 2018-04-10 00:49:42 · 205 阅读 · 0 评论 -
剑指offer第十三题链表中奇偶位置交换
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题目分析:黑色这一部分是本题的重点,如果没有这个要求,如果这题没有加粗的这个条件,这是一个原版微软笔试题,我也来说下做法,设置两个指针head和tail,分别指向首尾,head向后移动,直到找到第一个偶数,tail向前移...原创 2018-04-18 00:44:39 · 1388 阅读 · 0 评论 -
剑指offer第十四题链表中倒数K个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路:利用尺子原理,设置两个快慢指针,快得指针先走k-1步子,然后快慢指针同时走,快指针到头时,慢指针指向倒数k个元素。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Sol...原创 2018-04-18 09:51:14 · 117 阅读 · 0 评论 -
剑指offer第十五题链表逆序
输入一个链表,反转链表后,输出链表的所有元素。【题目分析】这个题目思路比较简单,思路代码中都有说明,需要注意的是,可以打印所有元素。这个代码是自己写的struct ListNode { int val;//数据域 ListNode *next;//指针域 ListNode(int x) : val(x), next(NULL) {}//不用考虑Next指针为空,定义了构造函...原创 2018-03-30 21:57:53 · 228 阅读 · 0 评论 -
剑指offer第十六题合并两个排序对的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目分析merge函数的写法,递归与非递归两种。核心思想都是用两个指针,用不断移动两个指针,小的放在前面。下面两种比较好的写法。class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {...原创 2018-04-18 22:50:48 · 157 阅读 · 0 评论 -
剑指offer第十七题树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题目分析:思路放一段大佬们写的代码吧,解释的异常清晰。虽说是JAVA代码但是,还是那句话语言是通的。二叉树的子树就是头结点开始后面的分支均相同。二叉树中结点太多,遍历结点比较用递归的方法比较合适。如果刚开始根结点相同,就开始比较左右子结点是否相同(注意这个过程不是判断子树的过程,而是严格比较左右子结点...原创 2018-04-19 00:11:33 · 180 阅读 · 0 评论 -
剑指offer第十八题二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路分析:两种方法,递归...原创 2018-04-19 00:27:52 · 161 阅读 · 0 评论 -
剑指offer第十九题顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.题目分析这个题目的思路比较简单,但是很容易陷入一个一个结点去找,坐标的思维中这样的方法很难实现。左神的课中也有原题。 但是对代码能力...原创 2018-04-19 23:09:55 · 157 阅读 · 0 评论 -
剑指offer第二十题包含min的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。题目分析实现栈结构,需要考虑的是不要用最复杂的栈实现去思考,因为重点是实现带有getMin功能的栈,由于栈是常用的数据结构,所以实现的时候考虑用最快的O(1)时间复杂度,效率更高,但是需要承担的就是额外空间复杂度。注意的地方有两点:1.push和pop时同时的,需要同时压栈或者出栈,不然会导致不平衡,输出结果会出现问题2...原创 2018-04-20 17:06:38 · 181 阅读 · 0 评论 -
剑指offer第二十一题栈的压入和弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)题目分析将压入顺序逐渐进栈,当遇到与第二个序列相同的pop,重复这个过程,不等时退出。如果为空...原创 2018-04-20 17:47:59 · 162 阅读 · 0 评论 -
剑指offer第二十二题从上往下遍历二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。题目分析层次遍历,最主要的是把二叉树的层次遍历当做为中先进先出的队列。例如打印根节点的时候就将左右节点按照顺序放入队列,在打印左节点的时候按顺序保存其左右节点,在pop队列元素即可。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right...原创 2018-04-20 21:15:22 · 243 阅读 · 0 评论 -
剑指offer第二十三题二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题目分析这道题有两种思路,根据后序遍历的规律左右根的结构,可以确定最后一个元素为根,第一部分是左子树结点的值,均小于根节点,第二部分的右子树都大于根节点。非递归 非递归也是一个基于递归的思想:左子树一定比右子树小,因此去掉根后,数字分为left,righ...原创 2018-04-20 22:10:13 · 173 阅读 · 0 评论 -
剑指offer第二十四题二叉树中和为某一路径的值
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。题目分析两种方法,递归的DFS和非递归的做法就是利用二叉树的后序遍历的非递归算法来做的,由于二叉树的后序遍历的非递归算法要借助辅助栈,当访问一个结点时,栈中的元素依次就是从根到达该结点的路径。/*struct TreeNode { int val;...原创 2018-04-21 00:40:10 · 178 阅读 · 0 评论 -
剑指offer第二十五题复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)题目分析/*struct RandomListNode { int label; struct RandomListNode *next, *random; ...原创 2018-04-21 10:55:25 · 201 阅读 · 0 评论 -
剑指offer第二十六题二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题目分析在二叉树中,每个结点都有两个指向子结点的指针。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。根据左子节点的值总是小于父结点的值,右子结点的值总是大于父结点的值。使用中序遍历树的结点。方法有两种递归非递归。/*struct TreeNode {...原创 2018-04-21 16:14:05 · 215 阅读 · 0 评论 -
剑指offer第二十七题字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。题目分析题目中要求字符串的全排列,但是重点是如何用字典序输出,这样的题目有投机取巧的做法,就是用STL的首先必然是利用库函数next_pe...原创 2018-04-21 17:39:14 · 211 阅读 · 0 评论 -
剑指offer第二十八题数字中出现次数超过一半的数
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题目分析拿到题目我的第一想法使用map,统计次数与size比较,O(n)即可。后来有想能不能改进,书上的快排思想感觉不适合奥卡姆剃刀原理。所以用了几种简单的算法。class Solu...原创 2018-04-22 00:57:15 · 192 阅读 · 0 评论 -
剑指offer第二十九题最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题目分析题风一转,简单易行,直接上代码吧。可以库函数sort,快排思想和堆排序class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input,...原创 2018-04-22 10:31:17 · 271 阅读 · 0 评论 -
剑指offer第三十题连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至...原创 2018-04-24 13:22:51 · 211 阅读 · 0 评论 -
剑指offer第三十一题整数中1出现的次数(从1到n整数中1出现的次)
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。题目分析写一个python的解法。一、1的数目编程之美上给出的规律:1. 如果第i位(自右至左,从1开始标号)...原创 2018-04-25 22:52:54 · 218 阅读 · 0 评论 -
剑指offer第三十二题把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。题目分析第一种暴力思路,枚举所有可能排序去最小值,但是肯定复杂度是比较高的,所以比较好的方法是转化为字符串,通过排序比较。class Solution {public: string PrintMinNum...原创 2018-04-25 22:37:28 · 181 阅读 · 0 评论 -
剑指offer第三十三题丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。题目分析说下思路,如果p是丑数,那么p=2^x * 3^y * 5^z,那么只要赋予x,y,z不同的值就能得到不同的丑数。如果要顺序找出丑数,要知道下面几个特(fei)点(hua)。对于任何丑数p:a.那么2*p,...原创 2018-04-27 00:20:17 · 356 阅读 · 0 评论 -
剑指offer第三十四题第一个只出现一次的字符
题目描述在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置题目分析看到题目第一想法就是用map,涉及计数和不同类型数据的存储。class Solution {public: int FirstNotRepeatingChar(string str) { map<char,int> mp; ...原创 2018-05-02 14:37:38 · 233 阅读 · 0 评论 -
剑指offer第三十五题数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,size<=2*10^5输入...原创 2018-08-27 16:36:59 · 289 阅读 · 0 评论 -
剑指offer第三十六题两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解决方案1.暴力法,遍历一个链表,没遍历一个结点的时候,在第二个链表上顺序遍历每个结点。2.用两个指针扫描3.”两个链表“,最终两个指针到达 null 或者到达公共结点。长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起...原创 2018-09-07 09:22:06 · 260 阅读 · 0 评论