
剑指offer
Dusa2333
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
序列化二叉树
一、问题描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过原创 2020-06-10 11:29:41 · 314 阅读 · 0 评论 -
从上往下打印二叉树
一、题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。二、解决思路用个队列***q***来记录节点,将每一行节点入队,挨个将每个节点出队,如果节点左孩子存在,左孩子就入队;如果右孩子存在,右孩子就入队。直到队列为空。三、Code(python)# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2020-06-08 21:58:23 · 180 阅读 · 0 评论 -
把二叉树打印成多行
一、题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。二、解决思路用Q1存储前一行节点,用Q2来存储下一行节点,用res存储结果将Q1首节点出队,如果首节点左孩子存在,那么将左孩子入Q2队;如果首节点右孩子存在,那么将右孩子入Q2队。递归,Q1和Q2交替着,没读完一行节点,将该行的节点值加入res三、code(python)递归# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):#原创 2020-06-08 21:54:15 · 187 阅读 · 0 评论 -
二叉搜索树的第k个结点
一、题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。二、解题思路二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。所以,按照中序遍历顺序找到第k个结点就是结果。⚠️:要注意,返回的是节点,而不是节点的值!!!三、Code(python)中序遍历(递归):# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):原创 2020-06-05 14:03:40 · 172 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
一、题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二、解题思路:2.1 相关概念满二叉树:从高到低,除了叶结点外,所有结点的左右结点都存在。**完全二叉树:**比满二叉树少几个叶结点,从左向右放子结点。**平衡二叉树:**空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也都是平衡树。**二叉搜索树:**空树或者二叉树的所有结点比它的左子结点大,比它的右子结点小。2.2 示例原创 2020-06-05 13:33:51 · 227 阅读 · 0 评论 -
按之字形顺序打印二叉树
一、题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。二、解题思路本题其实就是BFS的一种变形,只不过是奇数行按照从左往右,偶数行是按照从右往左,所以本文采用两个栈的形式记录奇数行和偶数行的内容,由于栈是FIFO,而我要结果是进的顺序,所以每行的内容需要翻转一次。三、Code(Python)# -*- coding:utf-8 -*-# class TreeNode:# def __i原创 2020-06-03 12:26:54 · 148 阅读 · 0 评论 -
栈的压入、弹出序列
# -*- coding:utf-8 -*-class Solution: def IsPopOrder(self, pushV, popV): # write code here push_len = len(pushV) pop_len = len(popV) if push_len != pop_len: return False aux_stack = [] i = 0原创 2020-06-03 12:20:55 · 190 阅读 · 0 评论 -
包含min函数的栈
一、题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。二、思路用个辅助栈来记录最小的数,栈顶即为min值。三、Codepython实现# -*- coding:utf-8 -*-class Solution: def __init__(self): self.stack = [] self.minstack原创 2020-06-02 08:43:16 · 114 阅读 · 0 评论 -
二进制中1的个数(一行代码)
一、题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。二、Codepython一行代码# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # write code here #一行代码 return sum([(n>>i & 1)for i in range(0, 32)])...原创 2020-06-02 08:39:32 · 188 阅读 · 0 评论 -
用两个栈实现队列(剑指offer)
一、题目描述题目来源:剑指offer题目详述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。二、题目详解两个栈,栈1和栈2入队: 如果栈2不为空,将栈2的内容全部pop到栈1里,然后栈1进行push操作;如果栈2为空,栈1直接push即可。出队: 如果栈1不为空,将栈1内容全部pop到栈2里,然后栈2进行pop;如果栈1为空,栈2直接pop即可。根据上面操作,即可满足队列的***FIFO*** 的push和pop操作。三、Code及提交结果1、C+原创 2020-05-30 10:27:24 · 145 阅读 · 0 评论 -
顺时针打印矩阵(剑指offer)
一、题目描述题目来源:剑指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.二、题目详解矩阵不为空时:1)输出矩阵的第一行(删除第一行);2)矩阵逆时针旋转90度成为新的矩阵,回到1)如此我们就想到用递归来实现,其中一个重要部分就是矩阵的旋转。可以采用原创 2020-05-28 14:07:04 · 144 阅读 · 0 评论 -
剪绳子(剑指offer)
一、题目描述题目来源:剑指offer题目详述:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述输入一个数n,意义见题面。(2 <= n <= 60)输出描述输出答案。示例:输入8输出16二、问题详原创 2020-05-28 13:21:53 · 314 阅读 · 0 评论 -
矩形覆盖(剑指offer)
一、题目描述题目来源:剑指offer具体描述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?示例:三、问题剖析n 个 21的小矩形无重叠地覆盖一个2n的大矩形,共有 F(n) 种方法当 n = 1 时,显然 F(n) = F(1) = 1当 n = 2 时,显然 F(n) = F(2) = 2当 n >=3 时,大矩形的最前端要么是以竖着的21的小矩形组成,要么是以2块横着的21 的小矩形组成(如下图原创 2020-05-27 01:08:29 · 136 阅读 · 0 评论 -
变态跳台阶(Python)
一、题目描述题目来源:剑指offer具体描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。二、解题思路设 n 阶台阶,青蛙的跳法为 F(n) 种。采用 贪心策略,从上往下开始分析,青蛙先一步跳 i(1<=i<=n-1) 阶 ,那么剩下的 n-i 阶就有F(n-i)种跳法,那么 n 阶台阶有 F(n) = F(n-1)+F(n-2)+…+F(1)三、Code(Python)# -*- coding:utf-8 -*-原创 2020-05-26 23:11:44 · 379 阅读 · 0 评论 -
跳台阶(剑指offer)
一、题目描述题目来源:剑指offer一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。二、解题思路本题其实就是斐波那契数列的变形,设n级的台阶的跳法为F(n)当 n = 1时:F(n) = F(1) = 1;当 n = 2时:F(n) = F(2) = 2;当 n >= 3时:F(n) = F(n-1) + F(n-2)具体分析如下:n 等于1或2时,结果很明显,不加赘述n 大于等于3时,问题可以化为跳到n-1阶原创 2020-05-25 21:18:36 · 116 阅读 · 0 评论 -
二维数组中的查找
二维数组中的查找一、来源剑指offer二、类型数组三、题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。四、解决方法及分析⚠️这是个有序的二维数组设数组行数为m, 列数为n法一1、思路:按行读取,然后可以用二分法判断目标是否在该行中(python实现时直接利用in来判断)2、code(python)# -*- coding:utf-原创 2020-05-23 17:21:49 · 148 阅读 · 0 评论