![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
淋巴不想动
logout
展开
-
时间复杂度与空间复杂度
一 . 简介复杂度是衡量算法好坏的一个刻度尺快/慢就是时间复杂度使用空间(内存)就是空间复杂度二 . 时间复杂度我们知道, CPU每秒运行的指令数是恒定的, 衡量算法快慢的标准就是算法运行的基本指令个数, 运行指令个数f(n)和数据规模n有关现在来了解一下大O渐进法, 这个方法就是极限的方法, 在大O符号表示法中, 时间复杂度的公式是 : T(n) = O(f(n)), 来看一个例子...转载 2019-06-06 14:40:53 · 232 阅读 · 0 评论 -
(剑指offer)23.链表中环的入口节点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出None。思路:1.找相遇点:设置一个快指针pFast一个慢指针pSlow,先找到一个相遇点,一定在环中2.计算环的长度: 从相遇点出发,到相遇点结束-1,即为环的长度。3.pFast:从pHead+环的长度出发;pSlow从pHead出发,当pFast=pSlow时,即为入口节点。class ListNode: d...原创 2019-09-12 19:53:28 · 149 阅读 · 0 评论 -
(剑指offer)24.反转链表
输入一个链表,反转链表后,输出新链表的表头。思路:1.设置两个指针,分别指向当前结点的前preNode后nextNode2.将当前结点的next指向前一个结点preNode。3.将当前结点和nextNode都向前移一个(preNode,pHead = pHead,nextNode)class solition: def ReverList(self,pHead): ...原创 2019-09-12 19:58:04 · 152 阅读 · 0 评论 -
(剑指offer)35.复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:1.先复制链表节点的值放在原来的节点后面,组成一个新的链表2.处理复杂指针:安排复制节点的复杂指针指向 原始节点复杂指针指向的下一个3.拆分这个链表,偶数节点为原链表,...原创 2019-09-13 17:25:44 · 148 阅读 · 0 评论 -
(剑指offer)25.合并两个有序链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:依次比较进行递归class ListNode: def __init__(self,x): self.val = x self.next = Noneclass Solution: def Merge(self,pHead1,pHead2): ...原创 2019-09-13 17:27:49 · 163 阅读 · 0 评论 -
(剑指offer)52.两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共结点。思路:1.先遍历两个链表,计算出长度2.让长度较长的先走 先走步数=长度差3.然后再两个链表一起走,值相同的第一个就是两个链表第一个公共节点时间复杂度:o(m+n)空间复杂度:比实现两个栈的思想低。class ListNode: def __init__(self, x): self.val = x s...原创 2019-09-13 18:38:01 · 137 阅读 · 0 评论 -
(剑指offer)26.树的子结构
输入两棵树A和B,判断B是不是A的子结构。思路:这道题我理解错了,其实B只有一个节点,这个节点也是A的子结构。1.树A中查找与根节点的值一样的节点。(先比较根AB,在比较根A的左孩子与根B,最后比较根A的右孩子和根B)2.树A中根节点的子树和树B是否具有相同的结构。class TreeNode: def __init__(self, x): self.val = ...原创 2019-09-14 13:52:18 · 179 阅读 · 0 评论 -
(剑指offer)27.二叉树的镜像
思路:先前序遍历这颗树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左右节点之后就得到了树的镜像。class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Noneclass Solution:...原创 2019-09-14 17:27:16 · 142 阅读 · 0 评论 -
(剑指offer)28.对称二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:1.针对前序遍历定义一种对称的遍历算法,即:根-右孩子-左孩子如果对称遍历和前序遍历相同则是对称子树。2.特殊情况,节点值全部相同。(考虑保存叶子节点None指针即可)class TreeNode: def __init__(self, x): ...原创 2019-09-14 19:48:04 · 215 阅读 · 0 评论 -
(剑指offer)33.二叉搜索树的后序遍历
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:递归。最后一个数字是树的根节点,第一部分是左子树节点的值,都比根节点小。第二部分是右子树节点的值,都比根节点大。class Solution: def VerifySquenceOfBST(self, sequence): ...原创 2019-09-14 22:08:26 · 188 阅读 · 0 评论 -
(剑指offer)34.二叉树中和为某一值的路径
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)class TreeNode: def __init__(self, x): self.val = x self.left = None s...原创 2019-09-15 16:36:11 · 335 阅读 · 0 评论 -
(剑指offer)面试题18:删除链表的节点
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点# 如果不是尾结点:o(1),把下一个节点的内容复制到需要删除的节点上覆盖原有内容,再把下一个节点删除# 如果删除的是尾结点,需要全部遍历:o(n)复杂度,利用前一节点删除# 平均复杂度仍然为o(1)# 链表只有一个节点,那么删除结点后还需要把头结点设为Noneclass ListNode: def __in...原创 2019-08-18 13:39:41 · 205 阅读 · 0 评论 -
(剑指offer)面试题22:链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个结点。这道题的思路很好如果在只希望一次遍历的情况下, 寻找倒数第k个结点, 可以设置两个指针第一个指针先往前走k-1步, 然后从第k步开始第二个指针指向头结点然后两个指针一起遍历当地一个指针指向尾节点的时候, 第二个指针正好指向倒数第k个结点推广: 寻找中间节点, 两个指针一起, 第一个指针每次走两步, 第二个指针每次走一步, 快指针指到尾部, 慢...原创 2019-08-18 16:30:41 · 207 阅读 · 0 评论 -
(剑指offer)面试题10:斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。变形:青蛙跳台,一只青蛙可以一次跳1个台阶,也可以一次跳2个台阶。求该青蛙跳上n级台阶总共多少种跳法class Solution: def Fibonacci(self,n): tempArray=[0,1] # 初始值0,1 if n>=2: f...原创 2019-07-20 13:56:02 · 186 阅读 · 0 评论 -
(剑指offer)面试题3:数组中重复的数字
找出数组中重复的数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。import collectionsclass Solution: def dulicate(sel...原创 2019-06-06 16:25:57 · 165 阅读 · 0 评论 -
(剑指offer)面试题4:二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。ass Solution: def Find(self,array,target): # 判断数组是否为空,注意牛客网没有判断非法输入也可以通过 if array==...原创 2019-06-06 16:27:47 · 215 阅读 · 0 评论 -
(剑指offer)面试题5:替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。这道题出的应该不是replace…class Solution: # s 源字符串运行时间:33ms # # 占用内存:5752k def replaceSpace(self, s): ...原创 2019-06-06 17:14:48 · 147 阅读 · 0 评论 -
(python数据结构1)理解时间复杂度
文章目录算法的概念算法的五大特性时间复杂度与“大O记法”最坏时间复杂度时间复杂度的几条基本计算规则Python内置类型性能分析数据结构概念算法与数据结构的区别抽象数据类型(Abstract Data Type)最常用的数据运算有五种:看的b站视频https://www.bilibili.com/video/av20982396/?p=1算法的概念算法是计算机处理信息的本质,因为计算机程序本质...原创 2019-06-10 21:57:51 · 1930 阅读 · 0 评论 -
(python数据结构2)单链表与单向循环链表
1.单链表"""单链表的时间复杂度不会变,分散的空间可以利用,但是占用空间大顺序表的空间必须是连续的"""class Node(object): def __init__(self,elem): self.elem = elem self.next = Noneclass SingleLinkList(object): def __...原创 2019-06-26 13:26:58 · 338 阅读 · 0 评论 -
(python数据结构3)二叉树、二叉树的遍历
二叉树二叉树的基本概念二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)二叉树的性质(特性)性质1: 在二叉树的第i层上至多有2^(i-1)个结点(i>0)性质2: 深度为k的二叉树至多有2^k - 1个结点(k>0)性质3: 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为...原创 2019-07-07 22:23:15 · 193 阅读 · 0 评论 -
复杂度相关笔记
一、时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。(2)时间复杂度在刚才提到...原创 2019-07-23 22:16:56 · 141 阅读 · 0 评论 -
(剑指offer)面试题7:重建二叉树
这个题主要利用递归求解。利用二叉树前序遍历和中序遍历的特性。前序遍历的第一个值一定为根节点,对应于中序遍历中间的一个点。在中序遍历序列中,这个点左侧的均为根的左子树,这个点右侧的均为根的右子树。这时可以利用递归,分别取前序遍历[1:i+1]和中序遍历的[:i]对应与左子树继续上一个过程,取前序遍历[i+1:]和中序遍历[i+1]对应于右子树继续上一个过程,最终得以重建二叉树。"""输入某二叉树...原创 2019-07-19 22:01:19 · 132 阅读 · 0 评论 -
(剑指offer)面试题8:二叉树的下一个节点
结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G)2、没有右子树的,也可以分成两类:a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ;b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点…直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点(M一直找到A发现是根节点,没...原创 2019-07-19 22:32:27 · 135 阅读 · 0 评论 -
(剑指offer)面试题9:用两个栈实现队列
栈后进先出,队列先进先出。1.当stack2不为空时,stack2中的栈顶元素是最先进入队列的元素,可以弹出。2.当stack2为空时,把stack1中的元素逐个弹入并压入stack2中,先入stack1的元素这时在stack2顶部,这时弹出stack2就完成了队列class Solution: def __init__(self): self.stack1=[] ...原创 2019-07-20 12:01:40 · 133 阅读 · 0 评论 -
(剑指offer)55.二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Noneclass Solution: def ...原创 2019-09-15 17:31:09 · 340 阅读 · 0 评论