数据结构与算法
文章平均质量分 53
数据结构与算法
敲代码敲到头发茂密
欲戴王冠,必承其重
展开
-
算法—详细讲解单向循环链表的实现(python)
单向循环列表如图所示单向循环链表的实现一、往链表头部添加一个节点值为41、新增一个节点node=Node(4)如果链表中的值为空:头节点指向新建节点node,新建的节点node的指针域指向头节点if self.is_empty():self.head=nodenode.next=self.headelse:先让node指针域指向当前链表的头节点node.next=self.head再让链表的尾节点指向nodecur=self.headwhile cur.next!=self.原创 2021-11-12 07:00:00 · 840 阅读 · 0 评论 -
算法—详细讲解单向链表的实现(python)
链表链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序通过链表中的指针链接次序实现链表由一系列节点组成,节点可以在运行时动态生成每个节点包含两个部分:存储数据元素的数据区、存储下一个节点地址的指针域每去存储一个数据就去申请一个节点单向链表特点:无法根据某一个节点去访问前一个节点第一个节点为头节点最后一个节点的指针域为空,称为尾节点单向链表的实现链表头部新增一个节点1、新增节点node指针域指向原链表的头节点node=Node(2)node.next=self原创 2021-11-11 07:00:00 · 1318 阅读 · 2 评论 -
【栈与队列】用队列实现栈、用栈实现队列
在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。如果进栈和出栈都为空的话,说明模拟的队列为空了。原创 2024-02-26 22:09:13 · 769 阅读 · 5 评论 -
算法题——给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。来源:力扣(LeetCode)原创 2023-03-15 09:31:29 · 1724 阅读 · 1 评论 -
算法面试题——删除链表后第N个节点
示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]进阶:你能尝试使用一趟扫描实现吗?原创 2022-12-08 21:11:58 · 787 阅读 · 9 评论 -
算法面试题---反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。原创 2022-11-25 21:15:12 · 263 阅读 · 12 评论 -
算法题——给你一个字符串s,找到s中最长的回文子串。
输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。*原创 2022-10-17 22:55:59 · 1631 阅读 · 64 评论 -
算法面试题——给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串 s ,判断字符串是否有效。
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/valid-parentheses。原创 2022-10-07 10:28:59 · 2807 阅读 · 24 评论 -
python算法面试题(一)
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]输入:nums = [0,1,2,2,3,0,4,2], val = 2。输入: nums = [1,2,3,4,5,6,7], k = 3。向右轮转 2 步: [6,7,1,2,3,4,5]原创 2022-10-02 20:02:10 · 1515 阅读 · 27 评论 -
数据结构与算法——桶排序
将数组的元素放入到桶中,并保证桶里是有序的。根据数组的最大值与最小值申请一些桶。时间复杂度为O(n)原创 2022-09-23 08:25:17 · 231 阅读 · 35 评论 -
数据结构与算法——插入排序
每次都将后面没有排好序的元素插入到前面排好序的元素中。时间复杂度O(n^2)原创 2022-09-21 09:53:08 · 460 阅读 · 37 评论 -
数据结构与算法——归并排序
分而治之将数组二分,一直分到不能再分为止自底向上有序地合并数组。原创 2022-09-13 08:50:33 · 710 阅读 · 38 评论 -
数据结构与算法——树的广度优先遍历
实现:往完全二叉树中添加一个节点,使得添加之后这棵树依旧是一棵完全二叉树class Node: def __init__(self, val): self.val = val # 数据域 self.left = None # 左指针域 self.right = None # 右指针域class Tree: def __init__(self): self.root = None # 树的根节点 def原创 2021-11-22 07:56:46 · 346 阅读 · 0 评论 -
数据结构与算法——二叉树的深度优先遍历
例1:写出这棵树的先序遍历,中序遍历,后序遍历结果1、先序遍历遍历顺序:根节点——>左子树——>右子树遍历结果:A—>B—>D—>H—>E—>C—>F—>G2、中序遍历遍历顺序:左子树——>根节点——>右子树遍历结果:H—>D—>B—>E—>A—>F—>C—>G3、后序遍历遍历顺序:左子树——>右子树——>根节点遍历结果:H—>D—>E—>B—>原创 2021-11-21 07:00:00 · 570 阅读 · 0 评论 -
数据结构与算法——树与二叉树详细分享
一、树1、定义:由n个有限节点组成一个具有层次关系的集合,看起来像一颗倒挂的树,特点:2、特点:a、每个节点有0个或多个子节点b、没有父节点的节点称为根节点c、每一个非根节点有且只有一个父节点d、除了根节点外,每个子节点可以分为多个不相交的子树二、树的术语1、节点的度:一个节点含有的子树的个数2、树的度:树中所有节点的度的最大值3、叶节点:度为0的节点4、子节点:一个节点含有的子树的根节点称为该节点的子节点5、父节点:若一个节点有子节点,那么这个节点就是其子节点的父节点6、兄弟节点原创 2021-11-20 07:00:00 · 763 阅读 · 0 评论 -
【python】数据结构与算法之快速排序(重要)
一、快速排序设定一个基准值pivot将数组重新排列,所有比pivot小的放在其前面,比pivot大的放后面,这操作称为分区操作对两边的数组重复前面两个步骤二、画图演示三、代码块采用递归思想def quickSort(nums): n=len(nums) if n<=1: return nums pivot=nums[0] left=[] right=[] for i in range(1,n): if nu原创 2021-11-19 07:00:00 · 355 阅读 · 0 评论 -
【python】数据结构与算法之二分查找
一、查找在一组数据中找某一个特定项的算法过程通常用来判断某个特定项是否在一组数据中,最终返回True或False常用的查找算法:顺序查找、二分查找、树表查找、哈希查找等二、二分查找二分查找又称为折半查找,要求待查表为有序表将表中间位置记录的关键字与查找关键字比较,如果相等则比较成功;否则利用中间位置的记录缩小区间,继续查找缩小后的区间。重复上面的步骤直到查找成功,或者子表不存在,则查找失败三、画图演示例如查找6是否在数组中1、找到中间值mid=len(nums)//2==52、索引为原创 2021-11-18 07:00:00 · 556 阅读 · 0 评论 -
【python】数据结构与算法之选择排序
一、选择排序初始状态:有序区为空,无序区为[0,…,n]每次找到无序区里的最小元素,添加到有序区的最后重复前面 的步骤,直到排序完成二、画图演示三、代码块def selectSort(nums): n=len(nums) #数组的长度 for i in range(n-1): #排序的次数n-1 #找无序区最小的元素 min_idx=i #代表无序区最小元素的索引 for j in range(i+1,n):原创 2021-11-17 07:00:00 · 532 阅读 · 0 评论 -
【python】数据结构与算法—哈希表
一、哈希表用顺序表来存数据存键值对时,通过哈希函数计算出键对应的索引,将值存到索引对应的数据区中获取数据时,通过哈希函数计算出键对应的索引,将该索引对应的数据取出来二、哈希冲突对于任何哈希函数,都会出现两个不同的元素映射到同一个位置上的情况,这种情况称为哈希冲突三、开链法哈希表的每一个位置都连接一个链表,当发生冲突时,冲突的元素会被加到该位置的链表的最后1、开链法存储数据四、开放寻址法如果哈希函数得到的位置i已经又数据了,那么就往后探查新的位置来存储这个值线性探测:如果i有数据原创 2021-11-16 07:00:00 · 1259 阅读 · 0 评论 -
【python】排序算法的稳定性&冒泡排序(画图详细讲解)
一、排序算法的稳定性二、冒泡排序a、重复比较相邻的元素,如果前面的比后面的大,就交换它们两个b、每次遍历整个数组,遍历完成后,下一次遍历的范围往左缩1位c、重复前面步骤,直到排序完成三、代码块n个数组循环n-1次def bobbleSort(nums): n = len(nums) # 得到数组的长度 for i in range(n - 1): # n个数组循环n-1次 for idx in range(0, n - 1 - i):原创 2021-11-15 07:00:00 · 396 阅读 · 0 评论 -
【python】数据结构与算法—双端队列(二)
一、双端队列的特点:可以对两端进行操作:队尾入队,队首出队;队尾出队,队首入队;二、双端队列要实现的操作:原创 2021-11-17 07:00:00 · 345 阅读 · 0 评论 -
【python】数据结构与算法—双端队列(一)
一、双端队列的特点:可以对两端进行操作:队尾入队,队首出队;队尾出队,队首入队;二、双端队列要实现的操作:三、代码块:class Deque: def __init__(self): self.items=[] def is_empty(self): return self.items==[] def length(self): return len(self.items) def push(self,item原创 2021-11-16 07:00:00 · 313 阅读 · 0 评论 -
【python】队列——用链表实现队列操作
1、判断队列是否为空def is_empty(self): return self._length==02、判断队列的长度def length(self): return self._length3、添加一个元素item到队尾def push(self,item): 新建一个node节点 node=Node(item) 如果队列为空 if self.empty(): self.head=node self.rear=node else: self原创 2021-11-14 07:00:00 · 1413 阅读 · 1 评论 -
【python】队列——用顺序表实现队列操作
一、队列队列特点:队尾入队,队首出队,先进先出二、队列要实现的操作1、创建一个空队列class Queue: def __init__(self) self.item=[]2、添加一个元素item到队尾def push(self,item): self.item.append(item)3、抛出队首元素def pop(self): if self.is_empty(): raise ValueError('队列为空') return self.ite原创 2021-11-15 07:00:00 · 996 阅读 · 0 评论 -
栈——用链表实现栈操作
一、添加一个元素到栈顶def push(self,data): node=Node(item,self.__top) node.next=self.__top self.__top=node self._size+=1二、弹出栈顶元素def pop(self) if self.is_empty(): print('栈为空') else: value=self.top.data self.__top=self.__top.next self._size-=1 .原创 2021-11-12 07:00:00 · 735 阅读 · 0 评论 -
栈——用顺序表实现栈操作
一、线性表特点线性表:由0个或者多个数据元素组成的有限序列除了第一个节点(头节点),都有前驱节点除了最后一个节点(尾节点),都有后继节点线性表主要由顺序存储结构或者链式存储结构一般线性表:可以自由的操作节点,例如顺序表,链表受限制性表:对节点的操作受到限制,例如栈和队列二、栈引入栈特点:1、只能对栈顶进行添加或者弹出2、后进先出三、栈要实现的操作1、创建一个空栈class Stack: def __init__(self): self.__data=[]2、pu原创 2021-11-11 07:00:00 · 974 阅读 · 2 评论 -
算法—详细讲解双向链表的实现(python)
双向链表双向链表的实现一、往链表的头部增加一个节点add(4)node=Node(4)if self.is_empty():node.next=self.headself.head=node else:让链表中原本的头节点的prev指向新的节点self.head.prev=nodenode.next=self.headself.head=nodeself._length+=1二、链表尾部添加一个节点append(4)node=Node(4)if self.hea原创 2021-11-13 07:00:00 · 1022 阅读 · 2 评论 -
算法—顺序表之列表的扩容机制(python实现)
顺序表中增加元素在尾部增加元素:时间复杂度为O(1)在任意位置插入元素:时间复杂度为O(n)顺序表中删除元素删除尾部元素:时间复杂度为O(1)删除任意位置元素:时间复杂度为O(n)PY_SSIZE_T_MAX=float('inf') #最大的容量obj_size=1class List: allocated=0 #容量默认为0 size=0 #元素个数默认为0 items=[] #数据区默认为空 def list_resize(self,原创 2021-11-10 07:00:00 · 1083 阅读 · 0 评论 -
算法—顺序表(二)
一、顺序表的结构表头:存储顺序表的信息包括数据区的容量和当前表中已有的元素个数数据区:存放表中元素数据二、顺序表分类一体式顺序表:表头与数据区存放在一起分离式顺序表:表头与数据区分开存储三、顺序表扩充扩充需要申请一块更大的数据区一体式顺序表:表头和数据区存储在一起,扩容时表头也要跟着变化分离式顺序表:表头和数据区分开存储,扩容时表头不足要变化...原创 2021-11-10 07:00:00 · 707 阅读 · 0 评论 -
算法—顺序表(一)
位(bit)最小的存储单位,每一位存储一个1位的二进制码字节(byte)由8个bit组成的存储单元int=4个字节=32bit1、a=1和b=2存储在计算机中(存储地址不连续)a=1、b=2以连续的形式存储在计算机中基本顺序表1、存储整数型数据第n个元素的地址 = 第1个元素的地址 + 元素类型内存大小*(n-1)元素外置顺序表因为内存地址占用的内存大小是相同的,可以通过:第n个元素的地址 = 第1个元素的地址 + 32*(n-1),计算内存地址所在的位置通过所在的位置能够真正拿原创 2021-11-09 07:00:00 · 489 阅读 · 0 评论 -
python—时间复杂度
一、时间复杂度规则1、计算时,往往只关注时间频度中最高次项,其他次要项和常数项忽略例如: T=3*n^3+2*n^2+10000时间的复杂度: O(n^3)2、顺序结构,时间复杂度按加法来计算让用户输入2个列表,一个列表的长度为m另一个为n,对这2个列表分别求和比较他们的和的大小循环遍历,分别求和,比较大小m步、n步 时间复杂度为O(m+n)3、循环结构,时间复杂度按乘法来运算T=n*n*34、分支结构:时间复杂度取最大值5、没有特殊说明时,算法的时间复杂度都是指最坏的时间复杂度最原创 2021-11-08 07:00:00 · 6581 阅读 · 0 评论 -
【python】算法引入及算法特性和时间复杂度
需求:如果a+b+c=1000,且 a^2+b^2=c^2(a,b,c为自然数),如何求出所有a、b、c可能的组合?步骤:第一步:分析需求找到以上所有满足两个条件的abc的组合第二步:设计算法尝试abc的所有组合,判断当前的组合是否满足以上2个条件,如果满足就输出,否则尝试下一个组合第三步:代码实现import timestart=time.time()for a in range(1001): for b in range(1001): for c in ra原创 2021-11-07 07:00:00 · 339 阅读 · 0 评论