大宝剑指offer
秋招算法刷code
hr_net
这个作者很懒,什么都没留下…
展开
-
剑指offer之和为S的连续子序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!tips:滑动窗口,根据窗口和进行一...原创 2019-08-10 13:18:27 · 449 阅读 · 0 评论 -
剑指offer之和为S的两个数
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。tips:设置头尾两个指针,根据两指针和进行一次遍历移动指针即可。# -*- coding:utf-8 -*-class Solution: def FindNumbersW...原创 2019-08-10 13:15:06 · 123 阅读 · 0 评论 -
剑指offer之平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树tips:判断是否为平衡二叉树,遍历左右子树的深度是否相差大于1. 即需要计算当前子树的最大深度。方法一:先序遍历,判断当前根节点的左右节点是否满足深度约束,若满足,递归左右子树的根节点。深度计算:O(logn),遍历后整个算法复杂度:O(n*logn)# -*- coding:utf-8 -*-# class Tre...原创 2019-08-09 16:02:02 · 102 阅读 · 0 评论 -
剑指offer之数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007tips:归并排序中,逆序数对=排序好的左半部分的逆序数对+排序好的右半部分的逆序数对+merge两部分的逆序数对merge过程中(从小到大排序),每当后者元素<前者...原创 2019-08-09 11:32:31 · 114 阅读 · 0 评论 -
剑指offer之最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。tips:很简单的大根堆实现# -*- coding:utf-8 -*-class Solution: def GetLeastNumbers_Solution(self, tinput, k): # write code h...原创 2019-08-08 21:57:35 · 137 阅读 · 0 评论 -
剑指offer之数组中出现次数超过一半的数字(多数投票问题)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。tips:维护两个变量,数组元素candidate和计数cnt。每当cnt为0时,遍历到的数组元素赋给candidate,每当遍历到的元素与candidate相同,cn...原创 2019-08-08 21:04:17 · 191 阅读 · 0 评论 -
剑指offer之栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)tips:由于压入和弹出的顺序不固定,故弹出序列有很多种,判断某种合法与否,...原创 2019-08-08 15:49:44 · 126 阅读 · 0 评论 -
剑指offer之包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。tips:一个栈结构不可能实现,需要添加辅助栈,每次压栈时两个栈同时push,其中保证辅助栈压入的是当前min函数的结果即可。# -*- coding:utf-8 -*-class Solution: def __init__(self): se...原创 2019-08-08 15:26:04 · 112 阅读 · 0 评论 -
剑指offer之树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)tips:先序遍历中,在遍历时添加两个节点处的判断。判断函数从节点处开始往左右子树递归。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# ...原创 2019-08-08 14:58:29 · 75 阅读 · 0 评论 -
剑指offer之数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。tips:本题在读取数据流的同时给出当前中位数。调用完insert()之后紧接着调用getmedi...原创 2019-08-07 23:05:16 · 122 阅读 · 0 评论 -
剑指offer之表示数字的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。tips:有效的数值,特殊字符包含"e"/"E",".","+"/"-", 三类(指数,小数点,符号)。我们可以对字符串顺序遍历,...原创 2019-08-05 17:28:24 · 131 阅读 · 0 评论 -
剑指offer之正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。tips:"."可代表任一字符,在字符==判断中需要将其进行约束。"*"代表0个1...原创 2019-08-05 15:59:07 · 123 阅读 · 0 评论 -
剑指offer:机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?tips: 上下左右、深度优先遍历算法。注意继续...原创 2019-07-26 21:25:47 · 105 阅读 · 0 评论 -
剑指offer之二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。tips:给定当前节点,求其在中序遍历的下一个节点,并且已知每个节点的父节点。方法一,可以通过给定节点的父节点循环追溯至根节点,然后通过根节点进行中序遍历,找到给定节点的下一个节点。该方法需要遍历整棵树,复杂度较高。方法二,我们只需遍历...原创 2019-06-21 11:29:31 · 185 阅读 · 0 评论 -
剑指offer之二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。tips:二叉搜索树的中序遍历为有序数组,我们可以在二叉搜索树的基础上进行双向指针的调整。既然要弄指针,就需要两个对象,我们设定一个pre指向前一个节点,每次循环将pre.right=cur;cur.left=pre。同时要保存头结点。代码如下:# -*- coding...原创 2019-05-31 10:18:56 · 103 阅读 · 0 评论 -
剑指offer之把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。tips1:排序问题,可以重新定义大小关系,使用传统排序方法如快排等完成。重新定义a,b两个整数的大小:if str(a)+str(b)>str(b)+str(a)则 a>b。coding如下...原创 2019-04-22 23:07:29 · 105 阅读 · 0 评论 -
剑指offer之最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。tips:首先的想法就是排序后输出前k个,但此时复杂度为O(n*logn)。我们可以采用堆结构将复杂度降低至O(n*logk)其中k为最小的k个元素的值。大根堆的使用:将arr[:k]构建长度为k的大根堆,然后从arr[k:]开始遍历,依次与堆顶结构比...原创 2019-04-18 22:08:17 · 80 阅读 · 0 评论 -
剑指offer之复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)复杂链表示意如上。tips:因为链表查找需要O(n)复杂度,对每个节点的random节点进行查找需要O(n**2)。我们在不借助哈希表的情况下,进行O(n)...原创 2019-04-17 20:01:17 · 86 阅读 · 0 评论 -
剑指offer之重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。tips:前序首字符为整棵树的根节点,找到其在中序中的位置即可判别根节点的左右子树,采用递归思路,代码如下。# -*- coding:...原创 2019-04-04 10:15:49 · 134 阅读 · 0 评论 -
剑指offer之序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树序列化时:“#”代表空,“!”代表该节点结束。采用先序遍历方式序列化。反序列化:按照先序方式# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = ...原创 2019-04-03 17:33:59 · 89 阅读 · 0 评论