数据结构与算法刷题——Python
皮蛋囍卤蛋
小白历险记
展开
-
快速排序算法
算法思想快速排序也是用的分治递归的思想,但是相比归并不需要额外的空间复杂度,空间复杂度为O(1)算法实现原创 2021-06-20 15:51:12 · 79 阅读 · 0 评论 -
归并排序算法
算法思想参考:归并排序归并排序是用到了分治的思想,分治的思想是将一个大问题拆分成很多的小问题,然后再将已经处理完成的小问题合并成整个的大问题。在这个过程中,大问题就得到了解决。在大数据方面的 Map-Reduce 就是这样的分治的思想。归并排序首先将数组等分,然后排序等分后的数组,最后再将排好序的两个数组合并成一个排好序的数组。归并排序的时间复杂度是O(n log n)算法实现''' 归并排序 ''' def mergeSort(self, array):原创 2021-06-19 22:26:28 · 69 阅读 · 1 评论 -
希尔排序算法
算法思想参考:希尔排序希尔排序是一种高效的排序方式,它是基于插入排序的一种排序算法。它相比插入排序能够有效的避免大量的移动操作。这种算法使用插入排序,只是比较的时候使用的是很远的数据进行比较,然后将它们排序。这个比较远的距离是通过下面的计算式子得出的:h = h * 3 + 1这种算法的时间复杂度是 O(n^2) ~ O(n*log2n).算法实现 ''' 希尔排序 ''' def shellSort(self, array): n = len(a原创 2021-06-19 21:48:07 · 67 阅读 · 0 评论 -
几种排序(冒泡、插入、选择)
参考:排序算法之冒泡, 插入, 选择冒泡排序算法思想这个排序算法的核心之处在于每个相邻的元素都进行比较,如果不是按顺序的形式,就交换彼此。这个算法不适用于大数据量的排序,因为它的平均时间复杂度和最差时间复杂度都是O(n^2)。第一趟冒泡的结果,将没排好序数组中的最大数通过冒泡的方式移动到了最后位置:剩余冒泡遍历后的结果算法实现# coding:utf-8'''冒泡排序'''def bubbleSort(array): n = len(array) # 循环n趟,原创 2021-06-19 21:10:39 · 187 阅读 · 0 评论 -
连续子数组的最大值
题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).输入输出输入:[1,-2,3,10,-4,7,2,-5]返回值:18说明:输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。解题思路循环遍历数组中的数字,连续数相加的和如果比当前遍历的数还小,则从当前遍历的数重新开始加和计算,否则,之前数字的和继续加上当前遍历的数字;原创 2021-06-19 15:48:46 · 136 阅读 · 0 评论 -
序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字原创 2021-06-19 10:14:26 · 198 阅读 · 0 评论 -
按之字形打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。输入输出输入:{8,6,10,5,7,9,11}返回值:[[8],[10,6],[5,7,9,11]]解题思路考虑边界条件,树为空时,返回空数组定义两个栈,一个用来存储打印顺序是从左往右打印的层的节点,这个栈中的元素入栈顺序时从右往左,与打印顺序相反,这样出栈的时候就是打印顺序从左往右;另一个栈用来存储打印顺序是从右往左打印的层的节点,这个原创 2021-06-18 17:31:59 · 59 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。输入输出示例示例1输入:{8,6,6,5,7,7,5}返回值:true示例2输入:{8,6,9,5,7,7,5}返回值:false解题思路二叉树的每个节点的左右子树都是一个镜像文件,即此二叉树就是对称二叉树(只有根节点或者树为空的情况也都为对称二叉树)。定义判断是否是镜像的函数,传入参数为左子树和右子树,用于判断每次左右子树是否是镜像的:此函数中,如果左节点和原创 2021-06-18 16:38:31 · 84 阅读 · 0 评论 -
二叉树的下一个节点
题目描述给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示示例:输入:{8,6,10,5,7,9,11},8返回:9解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打印9,如原创 2021-06-18 12:12:07 · 84 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。输入输出示例输入:[5,2,3,4,1,6,7,0,8]返回值:"5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00 "说明:数据流里面不断吐出的是5,2,3…,则得到的平原创 2021-06-18 11:51:46 · 117 阅读 · 0 评论 -
最小的K个数
题目描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组输入输出输入:[4,5,1,6,2,7,3,8],4返回值:[1,2,3,4]解题思路代码示例# coding:utf-8class Solution: def GetLeastNumbers_Solution(self, tinput, k): # 创建最大堆,最大堆用数组表示,原创 2021-06-18 09:29:38 · 67 阅读 · 0 评论 -
二叉搜索树与双向链表
转自:https://blog.csdn.net/u010005281/article/details/79657259题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构4.你不用输出或者处理,示例中输出里面的英文,比如原创 2021-06-16 22:53:56 · 139 阅读 · 1 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。输入输出示例示例1输入:{10,5,12,4,7},22返回值:[[10,5,7],[10,12]]示例2输入:{10,5,12,4,7},15返回值:[]解题思路广度优先的方式遍历二叉树。遍历的代码示例...原创 2021-06-16 21:01:26 · 61 阅读 · 0 评论 -
二叉搜索树的后续遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)输入输出示例输入:[4,8,6,12,16,14,10]返回值:true解题思路**二叉搜索树:**根节点的左子树上的所有节点值都比根节点的值小,右子树上所有节点的值都比根节点的值大;其次左子树和右子树也呈现这种趋势。如下是一个二叉搜索树。首先从输入的序列sequence中找出根节点,因为是确定的是后序原创 2021-06-16 16:26:00 · 90 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印输入输出示例输入:{5,4,#,3,#,2,#,1}返回值:[5,4,3,2,1]解题思路初始化:一个队列queue, 将root节点入队列queue中如果队列不空,做如下操作:弹出队列头,保存为node,将node的左右非空孩子加入队列做2,3步骤,直到队列为空代码示例# coding;utf-8class TreeNode(): def __init__(self, x): self.val原创 2021-06-15 17:45:14 · 62 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入输出示例输入:{8,6,10,5,7,9,11}返回值:{8,10,6,11,9,7,5}解题思路递归:交换根节点的左右子树;然后递归对左右子树的根节点的左右子树进行交换。非递归:非递归借助队列,让每一次的结点都保存到队列中,然后当前遍历的根节点出队,并交换其左右结点;判断左右结点是否存在,如果存在就存入队列,存入队列后循环执出队得到遍历节点,继续以同样的方式进行判断;直到队列为空,说明遍历完成。代码示例# coding:u原创 2021-06-15 17:01:30 · 67 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)输入输出示例示例1输入:{8,8,#,9,#,2,#,5},{8,9,#,2}返回值:true示例2输入:{8,8,#,9,#,2,#,5},{8,9,#,3}返回值:false解题思路使用递归。考虑为空的情况;判断两个树的根节点是否相等,如果相等则递归进行左右子树的比对;如果不相等,则继续遍历A树的左右子树,看是否与B树的根节点相等;这两个过程用两个递归解决代码示例# -*-原创 2021-06-15 11:40:24 · 51 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。输入输出示例输入:[1, 2, 3, 4, 5, 6, 7], [3, 2, 4, 1, 6, 5, 7]返回值:[1, 2, 5, 3, 4, 6, 7]解题思路对于已知二叉树的先序遍历和中序遍历如下:先序:pre=[1, 2, 3, 4, 5, 6,原创 2021-06-15 09:49:56 · 46 阅读 · 0 评论 -
二叉树的遍历(深度遍历)
递归遍历先序、中序、后序# coding:utf-8class TreeNode(object): def __init__(self, x): self.value = x self.left = None self.right = None# 递归遍历def preOrderRe(root): if root == None: return None print(root.value, end="原创 2021-06-14 17:18:01 · 114 阅读 · 0 评论 -
数组中只出现一次的两个数字
题目描述一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。输入输入示例输入:[1,4,1,6]返回值:[4, 6]说明:返回的结果中较小的数排在前面代码示例## 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可## # @param array int整型一维数组 # @return int整型一维数组#class Solution: def FindNumsAppearOnce(self , ar原创 2021-06-12 17:22:05 · 64 阅读 · 0 评论 -
丑数(第n个丑数)
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。输入输出示例输入:7返回值:8解题思路丑数:1, 2, 3, 4, 5, 6, 8, 9, 10…可发现规律:每个丑数都可以由其他两个丑数相乘而得到。12=2;13=3;15=5;22=4;23=6;24=222=8;33=9;25=10代码示例# -*- coding:utf-8 -*-clas原创 2021-06-12 16:19:33 · 140 阅读 · 0 评论 -
删除链表中的重复结点(不保留)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5输入输出示例输入:{1,2,3,3,4,4,5}返回值:{1, 2, 5}解题思路代码示例保留一个重复结点的情况# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):#原创 2021-06-09 16:01:20 · 151 阅读 · 0 评论 -
二进制中的个数
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示输入输出示例示例1:输入:10返回值:2示例2:输入:-1返回值:32解题思路补充知识补码:原码取反后加1-5:符号为为1,5的二进制原码为0000 0101-5的原码为:1 0000 0101;符号位不变其余位取反后:1 1111 1010;取反后加1 1111 1010 + 0000 0001=1 1111 1011方法一python中二进制不只有32位,首先使用0xFFFFFFFF截取n的32原创 2021-06-09 11:07:11 · 300 阅读 · 2 评论 -
小朋友的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得原创 2021-06-07 11:02:04 · 1008 阅读 · 4 评论 -
两个链表的第一个公共结点
题目描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题思路如图:对于长短不一致的两个链表pHead1、pHead2,使用双指针temp1=pHead1、temp2=pHead2,同时进行循环遍历,短的链表pHead1必定先走到None,这时让短链表的指针继续从长的链表的头结点开始继续遍历;紧接着当长链表pHead2也走到None时,继续从短链表的头结点继续遍历,这样两个指针所遍历的链表长度相等,即为长链表原创 2021-06-05 17:00:27 · 96 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)输入输出示例解题思路考虑空的情况首先复制链表中一样的结点,并添加到旧链表的相同链表结点的后面实现新建的每个node的random指向断开新旧两个链表的连接,并返回新链表的首节点代码示例class RandomListNode: def原创 2021-06-04 17:13:15 · 63 阅读 · 0 评论 -
合并两个有序链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则输入输出示例输入:{1, 3, 5}, {2, 4, 6}返回值:{1, 2, 3, 4, 5, 6}解题思路非递归解法代码示例# coding:utf-8'''合并两个有序链表'''class Solution: # 返回合并后列表 def Merge(self, pHead1, pHead2): # write code here原创 2021-06-04 11:52:18 · 61 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路双指针代码示例原创 2021-06-02 21:45:11 · 46 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrarList。输入输出示例输入:{6, 0, 24, 58}返回值:{58, 24, 0, 67}解题思路使用栈:将输入链表中的值依次按顺序存入一个新的栈空间中,然后将栈中的元素一次出栈,再以列表的形式组织起来即可。从头到尾遍历,逆序输出:代码示例使用栈的实现# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self原创 2021-06-02 17:21:32 · 49 阅读 · 0 评论 -
栈的压入、弹出系列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)输入输出示例输入:[1,2,3,4,5],[4,3,5,1,2]返回值:false解题思路每去压入一个栈的时候,都去判断是否与当前弹出的栈一样,如果一样就弹出,如果不一样就继续压入。首先原创 2021-05-31 16:35:03 · 638 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路要最少的时间复杂度,则用空间换时间。开辟一个新的空间用来存放每次栈中元素的最小值。具体如图所示。代码示例# -*- coding:utf-8 -*-class Solution: # 定义栈数据结构的对象 def __init__(self): self.stack = [] self.minValue = [] # 开辟新的空原创 2021-05-31 15:31:27 · 40 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。例如[3, 4, 5, 1, 2]是数组[1, 2, 3, 4, 5]的一个旋转。输入一个非递增减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。输入输出示例输入:[3, 4, 5, 1, 2]返回值:1解题思路旋转数组重要性质:因为旋转数组的两部分都是递增的,所以最小值一定比前面的值小。首先考虑数组为0情况,返回0;二分查找的思想,每次取中间值做出一下原创 2021-05-30 16:37:44 · 56 阅读 · 0 评论 -
用两个栈实现队列
用两个栈实现队列题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路创建两个栈,一个接收栈acceptStack,一个输出栈outputStack。实现的队列的入队push的主要操作由acceptStack实现,出队pop的主要操作由outputStack实现。acceptStack通过将数据追加到list中完成push操作;outputStack在栈不为空时方可实现pop操作,当outputStack为空时,acceptStack不为空时,需要将原创 2021-05-30 10:55:15 · 55 阅读 · 0 评论 -
替换字符串中的空格
替换空格题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。输入输出示例输入:“We Are Happy”返回值:“We%20Are%20Happy”解题思路写出替换字符串中某个元素的方法replace遍历字符串,遇到要替换的字符就将新的字符追加到数组中,不替换的直接追加到数组中,最后将数组中的所有字符以符合预期的格式拼接起来代码示例class Solution():原创 2021-05-29 18:24:56 · 260 阅读 · 0 评论 -
二维数组中查找
二维数组中的查找题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入输出示例示例1输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]返回值:true说明:存在7,返回true示例2输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]返回值原创 2021-05-29 17:35:57 · 94 阅读 · 0 评论 -
python中数组概念
python中的数组、栈与队列1.列表表示数组只保留list的根据索引取值,改变值的操作,取消append、删除等操作。数组只可变数据,不可变长度;列表可变数据,可变长度;元祖不可变;2.列表表示栈先进后出保留list的以下方法:入栈:append()方法追加;出栈:list[-1]获取栈顶元素;出栈:pop()方法删除栈顶元素3.列表表示队列先进先出python中使用列表list的结构,一端入队,一端出队第一种:入队:insert出队:pop; list[原创 2021-05-29 16:33:55 · 343 阅读 · 0 评论 -
变态跳台阶
变态跳台阶问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2台阶…它也可以跳上n级台阶。求该青蛙跳上一个n级台阶总共与多少种跳法。解题思路https://www.processon.com/view/link/60b1efc97d9c0878764403aef(n) = f(n-1) + f(n-2) + f(n-3) + … + f(1) = 2f(n-1)f(n-1) = f(n-2) + f(n-3) + … + f(1) = 2f(n-2)f(n-2) = f(n-3) + … +原创 2021-05-29 16:17:23 · 58 阅读 · 0 评论 -
青蛙跳台阶
青蛙跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路同斐波那契数列。n<1 f(n)=0n=1 f(1)=1n=2 f(2)=2n=3 f(3)=3n=4 f(4)=5n=5 f(5)=8…n>2 f(n) = f(n-1)+f(n-2)台阶数大于2时,每层台阶都会有两种选择:a.跳一个台阶,剩余n-1个台阶共有f(n-1)中跳法;b.跳两个台阶,剩余n-2个台阶共原创 2021-05-29 15:22:09 · 54 阅读 · 0 评论 -
斐波那契数列
斐波那契数列题目描述要求输入一个整数n,请输出斐波那契数列的第n项(从0开始,第0项为0),n <= 39。解法思路1.递归——写出通项数列:0, 1, 1, 2, 3, 5, 8, 13…n=0 num=0; n=1 num=1; n=2 num=1; n=3 num=2规律:n=0 f(0)=0n=1 f(1)=1当n>1 f(n) = f(n-1) + f(n-2)2. 非递归设置变量a=1, b=0,sum=old_a+old_b;new_b = ol原创 2021-05-29 11:13:06 · 148 阅读 · 0 评论 -
实现二叉树的先序、中序、后序遍历
实现二叉树的先序、中序、后序遍历题目描述分别按照二叉树的先序、中序和后序打印所有的节点。示例1输入:{1, 2, 3}返回值:[[1, 2, 3], [2, 1, 3], [2, 3, 1]]解题思路二叉树的遍历,按照常规的操作递归遍历:先序遍历:根,左,右中序遍历:左,根,右后序遍历:左,右,根代码示例1class TreeNode: def __init__(self, x): self.val = x self.left = None原创 2021-04-21 16:17:56 · 225 阅读 · 0 评论