剑指offer
026后勤仓库保管员
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指offer:1.二维数组的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路从右上角往左下角查找。代码Python# -*- coding:utf-8 -*-class Solution: # array 二维列表 def Fin...原创 2020-02-06 13:51:04 · 188 阅读 · 0 评论
-
剑指offer:40.数组中只出现一次的数字
40.数组中只出现一次的数字题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解题思路下面的思路来自《剑指offer》。将问题转化为只有一个数字只出现了一次。首先考虑数组中只有一个数字只出现了一次,只需要将数组中每个数字进行异或,最后得到的数字就是那个只出现了一次的数字,因此其他数字都是出现两次的,在异或的过程中被消掉了。然后问题就变成如何将数组拆分成两组(不一定要把两组数字拷贝到新的数组中),每组中都只有一个数字只出现一次原创 2021-01-19 21:17:13 · 203 阅读 · 0 评论 -
剑指offer:39.平衡二叉树
39.平衡二叉树题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路平衡二叉树:平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下F(n)=F(n−1)+F(n−2)+1F(n)=F(n-1)+F(n-2)+1F(n)=F(n−1)+F(n−2)+1这个类似于原创 2021-01-19 21:14:38 · 234 阅读 · 0 评论 -
剑指offer:38.二叉树的深度
38.二叉树的深度题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题思路下面的思路来自《剑指offer》。思路一,递归遍历所有路径,类似于《24.二叉树中和为某一值的路径》的方法。可以创建一个全局变量用于保存当前最长路径,再创建一个全局变量用于保存当前路径的深度,然后从根节点开始向下遍历整棵树,采用前序遍历方法,每次遍历到一个结点就把当前路径深度+1,递归完毕回退的时候就把当前路径深度-1,如果是原创 2021-01-19 21:10:25 · 338 阅读 · 0 评论 -
剑指offer:37.数字在排序数组中出现的次数
37.数字在排序数组中出现的次数题目描述统计一个数字在排序数组中出现的次数。 解题思路下面的思路来自《剑指offer》。思路一,从头到尾遍历统计,复杂度O(n)O(n)O(n)。思路二,折半查找,前后统计。既然是排序的数组,那就比较好办了,只需要找到这个数的位置,然后向前和向后统计一下数量就行,复杂度O(n)O(n)O(n)。思路三,找到第一个k和最后一个k的位置。利用二分查找法查找第一个k的位置,然后查找最后一个k的位置,有了两个位置就可以知道数字的数量了。复杂度O(log原创 2021-01-19 21:09:42 · 184 阅读 · 0 评论 -
剑指offer:36.两个链表的第一个公共结点
36.两个链表的第一个公共结点题目描述输入两个链表,找出它们的第一个公共结点。 解题思路下面的思路来自《剑指offer》。如果两个链表有公共结点,那么从这个公共结点开始,以下的全都是一样的。思路一,利用两个栈,从两个链表的底部开始对比。先将两个链表的所有结点依次入栈,然后从链尾开始对比,直到两个结点地址不相等。思路二,砍头同步遍历法。先对两个链表分别进行遍历,得到两个链表的长度,把长的那个链表头部多的几个结点砍掉(从长的链表上先走几步),这样两个链表就等长了,然后两个链表一起原创 2021-01-19 21:08:54 · 170 阅读 · 1 评论 -
剑指offer:35.数组中的逆序对
35.数组中的逆序对题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字。数据范围: 对于%50的数据,size<=10^4; 对于%75的数据,size<=10^5; 对于%100的数据,size<=2*10^5示例1输入:1,2,3,4,5,6,7,原创 2021-01-19 21:07:55 · 132 阅读 · 0 评论 -
剑指offer:34.第一个只出现一次的字符
34.第一个只出现一次的字符题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。 解题思路下面的思路来自《剑指offer》。思路一,笨办法。遍历每个字符,每个字符都和所有的字符对比。思路二,哈希表(字典,map)。第一次遍历的时候统计每个字符出现的次数,第二次遍历的时候查看字符串中每个字符出现的次数是否等于1。如果不能用标准库中的map的话,可以用数组来原创 2021-01-19 21:07:05 · 179 阅读 · 0 评论 -
剑指offer:33.丑数
33.丑数题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 解题思路下面的思路来自《剑指offer》。首先找丑数的规律,质数就是除了1和它本身以外没有其他的因子,丑数就是除了2,3,5以外没有其他的质因子,也就是说,如果一个数是丑数,那么它一定是由2,3,5相乘得到的,即一定可以写成这样的形式:p=2x∗3y∗5zp = 2^{x} * 3^原创 2021-01-19 21:05:28 · 154 阅读 · 0 评论 -
剑指offer:32.把数组排成最小的数
32.把数组排成最小的数题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 解题思路下面的思路来自《剑指offer》其实本质上还是排序算法,只不过排序的时候比大小的方式不一样了。将a和b转换成字符串以后,决定哪个应该放到前面的时候无非就两种结果,一种是ab,一种是ba,因此只需要比较ab和ba的大小就能判定a和b的大小。排序的时候使用快速排序就行原创 2021-01-19 21:03:52 · 156 阅读 · 0 评论 -
剑指offer:31.整数中1出现的次数(从1到n整数中1出现的次数)
31.整数中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可以通过不停和10取余数即n%10,判断余数原创 2021-01-18 16:04:48 · 167 阅读 · 0 评论 -
剑指offer:30.连续子数组的最大和
30.连续子数组的最大和题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)。 解题思路下面原创 2021-01-18 16:03:58 · 152 阅读 · 0 评论 -
剑指offer:29.最小的K个数
29.最小的K个数题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 解题思路下面的思路来自《剑指offer》思路一,快速排序后取前k位,写个快速排序还不是分分钟的事?看一下代码会发现实际上并不需要完全排序完毕。这种方法比较快,但是会对输入数组进行修改,如果要求不能修改输入数组的话这种方法就不好用了。思路二,用一个大小为k的容器(最大堆或者红黑树),依次读取数据,如果比当前容器最大值小的话,就原创 2021-01-18 16:03:14 · 190 阅读 · 0 评论 -
剑指offer:28.数组中出现次数超过一半的数字
28.数组中出现次数超过一半的数字题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 解题思路下面的思路来自《剑指offer》,思路的名字是我自己起的。思路一,排序后取中位数。首先进行快速排序,如果存在出现次数超过数组长度一半的数,那么这个数一定是排序以后最中间的数,即输入数组的中位数。然后再判断这个数字出现的次数原创 2021-01-18 16:02:09 · 207 阅读 · 0 评论 -
剑指offer:27.字符串的排列
27.字符串的排列题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 解题思路下面的思路来自《剑指offer》。可以把问题转换为,第一个字符固定,求后面的字符串的所有排列,使用递归的方式解决;思想如下面的图所示(结合代码看更容易理解):首先分别原创 2021-01-18 15:46:50 · 183 阅读 · 0 评论 -
剑指offer:26.二叉搜索树与双向链表
26.二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 解题思路下面的思路来自《剑指offer》将二叉搜索树转换成双向链表即当前结点的左指针指向左子树的最大结点,右指针指向右子树的最小节点,如下图所示:因此,只需要使用中序遍历的顺序进行转换(中序遍历一棵二叉搜索树即是从小到大输出),然后用一个指针pLastNode指向已经转换的链表的最大结点(尾结点)即可,刚开始时这个指针为NUL原创 2021-01-18 15:45:25 · 187 阅读 · 0 评论 -
剑指offer:25.复杂链表的复制
25.复杂链表的复制题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 解题思路下面的思路来自《剑指offer》,使用分治法,将整个任务分成几个步骤完成,复杂问题简单化。总共分为三步,每个步骤可以单独封装成一个函数完成:遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;重新遍历链表原创 2021-01-18 15:42:52 · 156 阅读 · 0 评论 -
剑指offer:24.二叉树中和为某一值的路径
24.二叉树中和为某一值的路径题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 解题思路思路一,递归,直接看代码可能更好理解一点,很巧妙。创建一个结果嵌套列表全局变量,和一个临时列表全局变量。从根节点一路往下递归,每次将结点加入临时列表,到底部时如果总和满足要求就将临时列表加入结果列表。每次返回之前将压入的结点弹出。&原创 2021-01-18 15:40:08 · 157 阅读 · 0 评论 -
剑指offer:23.二叉搜索树的后序遍历序列
23.二叉搜索树的后序遍历序列题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes, 否则输出No。假设输入的数组的任意两个数字都互不相同。 解题思路这种判断是不是某种遍历结果的题目一般都是通过依次划分左右子树,然后递归下去的方式。要先想这种遍历方式的最显著特点,后序遍历的话,序列的末尾一定是根,然后这又是二叉搜索树(BST),因此整个序列中,第一个比根大的结点一定是右子树中打印的第一个结点i,结点i左边的所有元素都是左子树,都需要比根小(已经原创 2021-01-18 15:38:57 · 217 阅读 · 0 评论 -
剑指offer:22.从上往下打印二叉树
22.从上往下打印二叉树题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。 解题思路So easy!通过队列就可以实现,先将根结点入队,然后每次从队列取出一个结点并输出,将结点的左右子结点入队。 代码思路一,也可以在循环外面把根结点入队,然后输出和左右子结点入队的操作就可以在循环中统一完成了。这样代码会简洁一点,但是多了一次入队出队操作。/*struct TreeNode { int val; struct TreeNode *left;原创 2021-01-18 15:28:27 · 146 阅读 · 0 评论 -
剑指offer:21.栈的压入、弹出序列
https://github.com/PhillipHuang2017/SwordOffer21.栈的压入、弹出序列题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。...原创 2020-02-18 19:31:35 · 204 阅读 · 0 评论 -
剑指offer:20.包含min函数的栈
https://github.com/PhillipHuang2017/SwordOffer20.包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)O(1)O(1))。解题思路思路一,设置两个栈,一个栈stack_data用于正常保存元素,另一个栈stack_min用于保存最小元素,如果新push的...原创 2020-02-17 15:44:18 · 168 阅读 · 0 评论 -
剑指offer:19.顺时针打印矩阵
https://github.com/PhillipHuang2017/SwordOffer19.顺时针打印矩阵题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字)。例如,如果输入如下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...原创 2020-02-17 15:42:02 · 180 阅读 · 0 评论 -
剑指offer:18.二叉树的镜像
https://github.com/PhillipHuang2017/SwordOffer18.二叉树的镜像题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8...原创 2020-02-16 17:36:30 · 159 阅读 · 0 评论 -
剑指offer:17.树的子结构
https://github.com/PhillipHuang2017/SwordOffer17.树的子结构题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路首先要搞清楚子树和子结构的区别:子树:如果B是A的子树,那么从A的某一个结点开始,一直到叶子结点要全都和B的结点相同(一直到根节点);子结构(本题):只要B是A里...原创 2020-02-16 17:34:04 · 284 阅读 · 0 评论 -
剑指offer:16.合并两个排序的链表
https://github.com/PhillipHuang2017/SwordOffer16.合并两个排序的链表题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路迭代思想,两个指针*next1,*next2分别指向两个链表的下一个结点,一个指针*p指向已经合并的链表的最后一个结点,比较next1和next2的val,把...原创 2020-02-16 17:32:35 · 162 阅读 · 0 评论 -
剑指offer:15.反转链表
https://github.com/PhillipHuang2017/SwordOffer15.反转链表题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路思路一,一路向下,两个指针,依次遍历结点,先保存下一个结点地址,然后将当前结点的指针反转。很简单,看代码就懂了,但是一定要注意避免出现断链(即忘了先保存下一个结点地址)和环路(即忘记将第一个结点的next改为NULL...原创 2020-02-15 20:13:05 · 204 阅读 · 0 评论 -
剑指offer:14.链表中倒数第k个结点
https://github.com/PhillipHuang2017/SwordOffer14.链表中倒数第k个结点题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路思路一,简单思路,先遍历整个链表,获得链表的长度,然后求出倒数第k个结点的下标,然后再遍历过去。思路二,设置两个指针,见下面的图,一目了然,两种方法其实复杂度差不多,实际上都是指针过两遍:设置...原创 2020-02-15 20:11:28 · 191 阅读 · 0 评论 -
剑指offer:13.调整数组顺序使奇数位于偶数前面
https://github.com/PhillipHuang2017/SwordOffer13.调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路方法一,类似于插入排序,依次检测,遇到奇数就把奇数调到前面去,前面的偶...原创 2020-02-14 14:38:40 · 187 阅读 · 0 评论 -
剑指offer:12.数值的整数次方
https://github.com/PhillipHuang2017/SwordOffer12.数值的整数次方题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方保证base和exponent不同时为0解题思路方法一,笨办法,累乘第一种思路是常规思路,也是笨办法,就是累乘,最容易想到(方法一),但是这种方法很慢...原创 2020-02-13 15:14:09 · 213 阅读 · 0 评论 -
剑指offer:11.二进制中1的个数
https://github.com/PhillipHuang2017/SwordOffer11.二进制中1的个数题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路负数用补码表示,所以运算方法和正数一样,无需做特殊考虑。这里用到了一个很巧妙的运算方式,即n & (n - 1),这个运算表示将最右边的1变成0,解释见下面因为n-1表示将n最右...原创 2020-02-12 18:43:21 · 195 阅读 · 0 评论 -
剑指offer:10.矩形覆盖
https://github.com/PhillipHuang2017/SwordOffer10.矩形覆盖题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路首先分析简单情况: f(1) = 1, f(2) = 2。当n >= 3时,先看第一个小矩形的摆放方式,如果第一个小矩形是横着...原创 2020-02-12 18:41:15 · 217 阅读 · 0 评论 -
剑指offer:9.变态跳台阶
https://github.com/PhillipHuang2017/SwordOffer9.变态跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路和简单版跳台阶不同的是,现在一次可以跳1~n级,因此最终跳到第n级台阶时,最后一跳就有n种可能,分别是从第0级,第1级…第n-1级跳上来,得出:f(...原创 2020-02-09 13:42:37 · 208 阅读 · 0 评论 -
剑指offer:8.跳台阶
https://github.com/PhillipHuang2017/SwordOffer8.跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路这个要反向思维来想,由于只能跳1级或者跳2级,因此跳到第n级台阶时,最后一跳只有两种可能,一种是从前一级台阶跳1级,另一种是从前两级台阶跳2级,得出...原创 2020-02-09 13:40:34 · 187 阅读 · 0 评论 -
剑指offer:7.斐波那契数列
https://github.com/PhillipHuang2017/SwordOffer7.斐波那契数列题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路很简单,不必多说,不要用递归就好,因为用递归的话重复计算次数太多,堆栈太多,既浪费空间又浪费时间。C++代码迭代(推荐)class ...原创 2020-02-09 13:38:10 · 277 阅读 · 0 评论 -
剑指offer:6.旋转数组的最小数字
https://github.com/PhillipHuang2017/SwordOffer6.旋转数组的最小数字题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返...原创 2020-02-08 19:30:36 · 168 阅读 · 0 评论 -
剑指offer:5.用两个栈实现一个队列
5.用两个栈实现一个队列题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析队列(Queue) :先进先出,队首英文为front,队尾英文为rear;栈(Stack) :先进后出,stack.top()可以返回栈顶元素的引用,stack.size()可以返回栈中元素个数;算法流程 :push的时候就往stack1中push,pop的时候如果...原创 2020-02-08 19:24:09 · 207 阅读 · 0 评论 -
剑指offer:4.重建二叉树
https://github.com/PhillipHuang2017/SwordOffer4.重建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析前序遍历:中左右,第一个为根节点...原创 2020-02-06 13:58:44 · 185 阅读 · 0 评论
分享