![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
ForcedOverflow
弱小和无知不是生存的障碍,傲慢才是。
展开
-
【剑指offer】3. 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。样例1 2 8 92 4 9 124 7 10 136 8 11 157输出True思路《剑指offer》P38从右上角的元素开始查找,分为以下...原创 2019-02-15 09:55:11 · 175 阅读 · 0 评论 -
【剑指offer】37. 两个链表的第一个公共节点(python)
题目描述输入两个链表,找出它们的第一个公共结点。思路《剑指offer》P193方法一使用辅助空间栈,遍历两个链表,将节点保存到栈中。然后利用栈先进后出的特点找到公共节点。方法二先遍历一遍得到两个链表的长度m和n,假设m>n,则较长的链表先走m-n步,然后两个链表同时向后走,直到找到第一个公共节点。code方法一# -*- coding:utf-8 -*-# cl...原创 2019-02-24 12:46:09 · 622 阅读 · 0 评论 -
【剑指offer】24. 二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路序列的最后一个数字为当前的根结点从头遍历序列,遇到第一个比根结点大的停止。此时序列被分为两个部分,左边的结点值都比根结点值小。判断序列右半部分值是否都比根结点值大,如果不是则不输出No,如果是则将左右两部分分别递归继续判断。(思路和【剑...原创 2019-02-19 13:12:12 · 179 阅读 · 0 评论 -
【剑指offer】38. 数字在排序数组中出现的次数(python)
题目描述统计一个数字在排序数组中出现的次数。思路《剑指offer》P204考虑使用二分法进行统计。第一次二分法,找到该数字出现的位置pos分别对pos左右两边的数组进行多次二分查找,找到首尾出现的位置。注意:k在数组中不存在的情况。code# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, dat...原创 2019-02-24 16:58:00 · 343 阅读 · 0 评论 -
【剑指offer】41&42. 和为s的两个数 & 和为s的连续正数序列(python)
41. 和为s的两个数题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述对应每个测试案例,输出两个数,小的先输出。思路《剑指offer》P214设置两个指针,p1从前向后,p2从后向前移动若p1+p2>7,则将p2向前移动一位若p1+p2<7,则将p1向后移动一位举例:...原创 2019-02-24 19:20:22 · 136 阅读 · 0 评论 -
【剑指offer】44. 扑克牌顺子
题目描述从扑克牌中随机抽5张,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,小王和大王可以看成任意数字(在输入中处理为0)思路《剑指offer》P226先对数组进行排序(代码里是写了一个快排,时间复杂度O(nlogn),也可以使用python自带的sorted()函数或者list.sort()函数,时间复杂度也是O(nlogn))...原创 2019-02-24 20:16:35 · 119 阅读 · 0 评论 -
【剑指offer】51. 数组中重复的数字(python)
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路《剑指offer》P261方法一考虑用一个哈希表来保存已经出现的数字和出现的次数,当遇到第一个重复数字的时候返...原创 2019-02-24 21:58:10 · 408 阅读 · 0 评论 -
【剑指offer】25. 二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路定义两个list,保存当前的路径的tmp和结果result。对于当前传入的结点root,将其加入结果中,然后判断expectNumber-root.val值是否为0,如果为0,...原创 2019-02-19 14:31:25 · 98 阅读 · 0 评论 -
【剑指offer】57. 删除链表中的重复节点(python)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路《剑指offer》P273方法一考虑借助一个辅助list,每次放入一个node,记录当前结点的值currValue。当下一个结点值与currValue相等,...原创 2019-02-25 08:47:06 · 748 阅读 · 0 评论 -
【剑指offer】26. 复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)示例1思路《剑指offer》P147参考书中的解析,一共分为三步:对原表的每一个结点进行复制,并插入到被复制结点后。根据原表中的每一个random结点,给复制结点...原创 2019-02-19 15:36:46 · 103 阅读 · 0 评论 -
【剑指offer】27. 二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路《剑指offer》P151对二叉搜索树的中序遍历结果,即为有从小到大的排序结果。遵循这个思路,可以先将二叉搜索树进行中序遍历,将结果保存在list中,然后依次取出node对其左右孩子重新连接。code# -*- coding:utf-8 -*-# class ...原创 2019-02-19 15:59:33 · 114 阅读 · 0 评论 -
【剑指offer】58.二叉树的下一个结点(python)
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路《剑指offer》P275给定结点分为两种情况:有右子树——则下一个结点是右子树的最左结点。没有右子树,但是有父节点——则向上找到一个父节点,使得给定节点所在子树,是该父节点的左子树。若不满足以上两种情况,则返回None。code#...原创 2019-02-25 10:13:54 · 667 阅读 · 0 评论 -
【剑指offer】59. 对称二叉树(python)
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路《剑指offer》P277方法一:递归解法先对根节点进行非空判断,然后判断左右子树是否互为镜像,具体做法是:递归地判断左子树的左孩子与右子树的右孩子值是否相等。方法二:非递归先对根结点进行非空判断,然后分别将左右子树放入一个list中。每次去除两个结点,比较...原创 2019-02-25 11:13:08 · 716 阅读 · 0 评论 -
【剑指offer】63. 二叉搜索树的第k个节点(python)
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路《剑指offer》P285根据二叉搜索树的特性可知,其中序遍历即为升序数组。code# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# ...原创 2019-02-25 11:31:32 · 551 阅读 · 2 评论 -
【剑指offer】28. 字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路《剑指offer》P154本质上是全排列问题,使用回溯法:有两点要注意:输出的结果必须按照字典序排列。有重复字母的时候,注意剔除重复的组合。code# -*- coding:utf-8 -*...原创 2019-02-19 17:29:54 · 196 阅读 · 0 评论 -
【剑指offer】62.序列化二叉树(python)
题目描述请实现两个函数,分别用来序列化和反序列化二叉树。思路《剑指offer》P283序列化序列化的方法可以借鉴先序遍历的思想,当遍历到叶子节点的时候,添加#。反序列化反序列化可以通过递归来实现。定义一个index记录当前的下标,如果当前是数字,则构造一个TreeNode节点,并递归地向后构造其左右孩子。如果当前是#,则构造一个空结点。返回该结点。code# -*- cod...原创 2019-02-25 12:51:17 · 354 阅读 · 0 评论 -
【剑指offer】29. 数组中出现超过一半的数字(python)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路《剑指offer》P163方法一:使用快排的思想,先随机选择一个数字,进行一趟排序,使得该数字左边的数都比其小,右边的数都比其大,然后判断该数字的index是否位于...原创 2019-02-20 09:53:52 · 133 阅读 · 0 评论 -
【剑指offer】65. 滑动窗口的最大值(python)
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,5...原创 2019-02-25 18:06:41 · 654 阅读 · 1 评论 -
【剑指offer】36. 数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述题目保证输入的数组中没有的相同的数字数据范围: 对于%50的数据,size&lt;=10^4 对于%75的数据,size&lt;=10^5 对于%100的数据,size...原创 2019-02-24 12:28:23 · 115 阅读 · 0 评论 -
【剑指offer】35. 第一个只出现一次的字符(python)
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)思路《剑指offer》P186考虑遍历一遍字符串,将每个字符出现的次数保存在一个orderedDict中,第一次出现的位置保存在Dict中。然后找到一个次数为1的字符,返回它的index。字典的查找和插入的时间复杂度都是O...原创 2019-02-22 21:58:13 · 323 阅读 · 0 评论 -
【剑指offer】34. 丑数(python)
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路《剑指offer》P163从小到大依次所有的丑数,并保存。code# -*- coding:utf-8 -*-class Solution: def GetUglyNumber_Sol...原创 2019-02-22 21:35:28 · 212 阅读 · 0 评论 -
【剑指offer】4. 替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。样例输入We Are Happy输出We%20Are%20Happy思路《剑指offer》P45本题主要是考虑在O(N)时间内,不开辟额外存储空间来实现。第一次遍历,计算空格数量和原字符串长度,新字符串长度=原长...原创 2019-02-15 10:58:55 · 101 阅读 · 0 评论 -
【剑指offer】5. 从头到尾打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。样例输入1->2->3输出[3,2,1]思路《剑指offer》P51利用 栈-先进后出 的特点,遍历一次保存在栈中,然后输出。递归。code非递归方法# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, ...原创 2019-02-15 15:27:54 · 174 阅读 · 0 评论 -
【剑指offer】6. 重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。样例输入[1,2,4,7,3,5,6,8][4,7,2,1,5,3,8,6]输出# 树的层次遍历结果:[1,2,3,4,5,6,7,8]...原创 2019-02-15 16:17:48 · 117 阅读 · 1 评论 -
【剑指offer】7. 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路《剑指offer》P59入队的元素进入stack1,出队的元素从stack2中获取:入栈时:直接push进stack1中即可;出栈时考虑两种情况:stack2为空时,需要将stack1中的元素依次弹出并压入stack2中,再从stack2中取即可;stack2不为空时,直接从stac...原创 2019-02-15 16:36:47 · 134 阅读 · 0 评论 -
【剑指offer】8. 旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路《剑指offer》P66旋转数组的本质是两个有序数组,其中后一个数组的所有元素都不大于前一个数组。因此,...原创 2019-02-15 20:11:23 · 131 阅读 · 0 评论 -
【剑指offer】9. 斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n&amp;lt;=39思路《剑指offer》P73书中指出,很容易想到的递归解法,也存在很明显的效率问题,如下图:可以看出该树中很多节点是重复的,算法的时间复杂度是以n的指数形式递增的,因此本题如果用递归做则会超时。code# -*- coding:utf-8 -*-clas...原创 2019-02-15 23:37:27 · 132 阅读 · 0 评论 -
【剑指offer】11. 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路《剑指offer》P90指数的三种情况:正数,0,负数。底数的三种情况:0,其他。(在指数<0时求倒数)注意在判断底数是不是为0时不能直接base == 0.0判断,因为在计算机内表示小数时(float/double)都有误差,只能定义一个很小的误差范围,判...原创 2019-02-16 09:32:58 · 111 阅读 · 0 评论 -
【剑指offer】49. 把字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0样例输入+21474836471a33输出2147...原创 2019-02-16 10:27:30 · 124 阅读 · 0 评论 -
【剑指offer】12.打印1到最大的n位数
题目描述输入数字n,按照顺序打印出从1到最大的n位十进制数。样例输入2输出1~9之间的所有整数思路《剑指offer》P94很容易想到定义一个整型数字,依次加1并输出,但是这种情况,当输入的n很大时会造成溢出。因此,考虑用字符串来保存所有位上的数字,然后模拟加法。注意的问题:进位到达最高位时的处理输出时,不输出高位上的0,如值为01则输出1code非递归cla...原创 2019-02-16 15:42:02 · 80 阅读 · 0 评论 -
【剑指offer】14. 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路《剑指offer》P102注意,书上给出的题目是不考虑奇数、偶数各自之间的相对顺序的,但是牛客网上给出的要求是相对位置不变。书上给出的解法是:设置两个指针,p1从前向后,p2从后向前移动,p1为偶数p2为奇数时...原创 2019-02-16 17:32:12 · 86 阅读 · 0 评论 -
【剑指offer】15. 链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路《剑指offer》P107两个指针遍历的方法,但是注意到要考虑一下三种特殊情况:输入的头结点为空k=0k &amp;amp;amp;gt; 链表长度codeclass Solution: def FindKthToTail(self, head, k): # write code here if not h...原创 2019-02-16 18:15:42 · 103 阅读 · 0 评论 -
【剑指offer】16. 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路《剑指offer》P112code# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: # 返回ListNo...原创 2019-02-16 23:11:10 · 131 阅读 · 0 评论 -
【剑指offer】题目类别整理汇总
数组3. 二维数组中的查找字符串4. 替换空格链表树栈和队列查找和排序递归和循环位运算原创 2019-02-16 23:15:24 · 655 阅读 · 0 评论 -
【剑指offer】17. 合并两个排序链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路《剑指offer》P114新建一个节点pre作为头结点,取list1和list2中当前值较小的结点接入,并将指针后移,直到其中一个链表到达末尾。code# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, ...原创 2019-02-17 09:06:14 · 112 阅读 · 0 评论 -
【剑指offer】18. 树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路《剑指offer》P117判断主要分两个步骤:两棵树的当前节点值是否相等。不相等,则将树A指针移动到其左/右孩子节点再判断相等,则同时移动两棵树的指针,判断其左右孩子值是否相等code# -*- coding:utf-8 -*-# class TreeNode:# ...原创 2019-02-17 09:56:55 · 108 阅读 · 0 评论 -
【剑指offer】19. 二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。思路《剑指offer》P125将当前结点视为根结点,交换左右子树,递归地再对左右子树进行操作。注意判断以下两种情况:空树左右子树都为空code# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x...原创 2019-02-17 10:26:46 · 138 阅读 · 0 评论 -
二叉树的遍历问题
在刷《剑指offer》的过程中做到关于二叉树的题目,顺便将leetcode上二叉树的遍历相关的代码复习一遍:先序遍历(递归+非递归)中序遍历(递归+非递归)后序遍历(递归+非递归)层次遍历二叉树先序遍历递归# Definition for a binary tree node.# class TreeNode(object):# def __init__(self...原创 2019-02-17 15:10:19 · 501 阅读 · 0 评论 -
【剑指offer】55. 字符流中第一个不重复的字符(python)
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路《剑指offer》P269考虑使用一个有序字典OrderedDict()来保存每个字符及其出现的次数,字...原创 2019-02-25 18:29:28 · 445 阅读 · 0 评论