![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
。
爱吃火锅的仙女
这个作者很懒,什么都没留下…
展开
-
数据结构中的堆
好久没写博客了。今天在做力扣丑数这道题的时候用到了python内置的小顶堆。所以来总结一下关于堆的内容~1. 堆的概念堆是一颗完全二叉树小顶堆:任意一个节点的左右孩子的值都大于此节点的值。即堆顶上维护了一个堆中最小的数。大顶堆:任意一个节点的左右孩子的值都小于此节点的值。即对顶上维护了一个堆中最大的数。2.堆的创建以小堆为例:向上调整算法(向下调整类似,满足堆的概念即可)时间复杂度为O(n)先设定倒数第一个叶子结点为当前结点cur,找出他的父节点parent比较cur和parent的值,原创 2021-08-22 21:25:47 · 102 阅读 · 0 评论 -
经典面试题:三种解法求解最长回文子字符串
回文串是指正反两个方向都一样的字符串。故很容易想到暴力解法,列出所有的回文子串,再判断res是否等于res[::-1]此种解法的时间复杂度是O(n3)####最长回文子串def longestPalindrome(s): n=len(s) max_len=1 ##给定初始最大长度 res=s[0] ##设初值 if n<=1:return res ##当只有单个字符时,一定是回文串 for j in range原创 2021-05-16 15:21:13 · 173 阅读 · 0 评论 -
【面试常考算法】N叉树的遍历系列总结
和二叉树类似,N叉树的遍历也有递归和迭代两种写法,同时,递归写法比较简单。具体题目参照leetcode589,590,429结点定义:class Node: def __init__(self, val=None, children=None): self.val = val self.children = children"""仿照上一节的二叉树遍历写法,相信是可以写出来的~递归法前序遍历~class Solution: def preor原创 2021-07-23 16:37:10 · 198 阅读 · 0 评论 -
【面试常考算法】二叉树遍历系列总结
本篇主要记录二叉树的四种遍历方式(前序、中序、后序、层序)。一般可以使用递归或迭代进行遍历。题目参考力扣144.94.145.102转载 2021-07-23 11:58:00 · 177 阅读 · 0 评论 -
常见面试题:在两个长度相等的排序数组中找到上中位数
题目描述:给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2个数思路1:使用归并排序,将两个数组先排序,再返回上中位数。时间复杂度O(2N),空间复杂度O(2N)def guibing_sort(arr1,arr2): arr=[] i=j=0 l1,l2=len(arr1),len(arr2) while i<l1 and j&l原创 2021-05-25 11:00:16 · 230 阅读 · 0 评论 -
经典面试题:连续子数组和的最大值
问题描述:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6连续子数组为[4,-1,2,1]三种方法:1.暴力法。列出所有的子数组,对所有子数组求和。两层循环。比如第一个数为-2时,依次求出sum(-2),sum(-2,1),sum(-2,1,-3)…保留最大的和。然后从第二个数开始,继续求出,sum(1),sum(1,-3),sum(1,-3,4)…max_sum=nums[0]原创 2021-05-01 20:42:09 · 121 阅读 · 0 评论 -
【面试常考算法】经典的 Top K 问题
输出最小的k个数方法一:排序对原数组从小到大排序后取出前k个数即可。直接调用sort函数def smallestK(a,k): a.sort() return a[:k]方法二:堆用一个大根堆实时维护数组的前k小值。首先将k个数插入大根堆中,随后从第k+1个数开始遍历,如果当前遍历到的数比大根堆的堆顶的数要小,就把堆顶的数弹出,再插入到当前遍历到的数。最后将大根堆里的数存入数组返回即可。利用python中的heapq模块def smallestK(a,k): if k原创 2021-04-16 21:38:57 · 154 阅读 · 0 评论 -
【面试常考算法】排序算法汇总~
原理性内容可参见:https://blog.csdn.net/weixin_41571493/article/details/818750881. 冒泡排序相邻两个值比较,每次确定一个最值放在数据尾部对n个值进行操作,重复n-1趟时间复杂度O(n^2)def BubbleSort(arr): n=len(arr) if n<=1:return for i in range(n-1): for j in range(n-i-1): if arr[j]>arr[j+1]原创 2021-04-16 20:56:46 · 172 阅读 · 1 评论 -
【数据结构与算法】各种排序方法比较
一.时间性能1.按平均的时间性能来分,有三类排序方法:时间复杂度为O(nlogn):快速排序、堆排序和归并排序,快速排序最好时间复杂度为O(n2):直接插入排序、冒泡排序和简单选择排序,直接插入最好时间复杂度为O(n):基数排序2.当待排记录序列按关键字顺序有序时,直接插入排序和冒泡排序能达到O(n)的时间复杂度;对于快速排序,这是最不好的情况,此时时间性能退化为O(n2),因此是应该尽量避免的情况。3。简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变二.空间性能1.原创 2021-03-26 21:27:14 · 524 阅读 · 0 评论 -
【数据结构与算法】排序
插入排序交换排序选择排序归并排序基数排序外部排序插入排序顺序法定位插入位置→直接插入排序二分法定位插入位置→二分插入排序缩小增量多遍插入排序→希尔排序直接插入排序1.复制插入元素(也可以增加哨兵)2.记录后移,查找插入位置3.插入到正确位置void InsertSort(SqList &L){ int i j; for(i=2;i<=L.length;++i){ if(L.r[i].key<l.r[i-1].key){ //若“<”,需将L.原创 2021-03-26 21:14:57 · 158 阅读 · 0 评论 -
树表的查找
二叉排序树1)若其左子树非空,则左子树所有节点的值均小于根节点的值2)若其右子树非空,则右子树所有节点的值均大于等于根节点的值3)其左右子树本身又各是一颗二叉排序树对二叉排序树进行中序遍历,结果为由小到大的序列二叉排序树的存储结构typedef struct{ KeyType key; //关键字项 InfoType otherinfo; //其他数据域}ElemType;typedef struct BSTNode{ ElemType data; //数据原创 2021-03-19 18:22:58 · 84 阅读 · 0 评论 -
【数据结构与算法】线性表的查找
顺序查找(线性查找)折半查找(二分或对分查找)分块查找顺序查找typedef struct{ //顺序表结构类型定义 ElemType *R; //表基址 int length; //表长}SSTable ;SSTable ST; //定义顺序表STint Search_Seq(SSTable ST,KeyType key){ //若成功返回其位置信息,否则返回0 for(i=ST.length;i>=1;--i) if(ST.R[i].key==key) re.原创 2021-03-19 15:25:17 · 301 阅读 · 0 评论 -
【数据结构与算法】图的遍历
图的遍历方法深度优先搜索(DFS)广度优先搜索(BFS)邻接矩阵表示的无向图深度遍历实现void DFS(AMGraph G,int v){ //图G为邻接矩阵类型 cout<<v;visited[v]=true; //访问第v个结点 for(w=0;w<G.vexnum;w++) //依次检查邻接矩阵v所在的行 if((G.arcs[v][w]!=0)&&(!visited[w])) DFS(G,w); //w是v的邻接点,如果w未访原创 2021-03-18 20:39:32 · 374 阅读 · 0 评论 -
【数据结构与算法】图的存储结构
图的存储结构1.邻接矩阵的存储表示用两个数组分别存储顶点表和邻接矩阵#define MaxInt 32767 //表示极大值,即∞#define MVNum 100 //最大顶点数typedef char VerTexType; //设顶点的数据类型为字符型typedef int ArcType; //设边的权值类型为字符型typedef struct{ VerTexType vexs[MVNum]; //顶点表 ArcType原创 2021-03-18 16:32:48 · 175 阅读 · 2 评论 -
【数据结构与算法】哈夫曼树
哈夫曼树的带权路径长度最短。特点:满二叉树不一定是哈夫曼树哈夫曼树种权越大的叶子离根越近具有相同带权结点的哈夫曼树不唯一包含n个叶子结点的哈夫曼树共有2n-1个结点哈夫曼树的结点的度数为0或2,没有度为1的结点构造哈夫曼树方法(口诀)构造森林全是根选用两小造新树删除两小添新人重复2,3剩单根总结:1.在哈夫曼算法中,初始时有n棵二叉树,要经过n-1次合并最终形成哈夫曼树。2.经过n-1次合并产生n-1个新结点,且这n-1个新结点都是具有两个孩子的分支节点。可见:哈夫曼树原创 2021-03-03 22:14:51 · 1140 阅读 · 1 评论 -
【数据结构与算法】树和森林
树的存储结构1.双亲表示法//结点结构typedef struct PTNode{ TElemType data; int parent; //双亲位置域 }PTNode//树结构#define MAX_TREE_SIZE 100typedef struct{ PTNode nodes[MAX_TREE_SIZE]; int r,n; //根结点的位置和结点个数 }PTree;...原创 2021-03-03 18:38:30 · 72 阅读 · 0 评论 -
【数据结构与算法】二叉树
对二叉树内容做以下总结:二叉树的性质性质1:在二叉树的第i层上至多有2^(i-1)个结点(i≥1)。性质2:深度为k的二叉树至多有2^(k)-1个结点。(k≥1)。性质3:对任何一颗二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0=n2+1。满二叉树:一颗深度为k且有2^(k)-1个结点的二叉树称为满二叉树。...原创 2021-03-03 00:36:01 · 554 阅读 · 0 评论 -
【数据结构与算法】串的类型定义,BF算法及KMP算法
串的顺序存储结构#define MAXLEN 255typedef struct{ char ch[MAXLEN+1]; //存储串的一维数据 int length; //串的当前长度 }SString;串的链式存储结构——块链结构#define CHUNKSIZE 80 //块的大小可由用户定义typedef struct Chunk{ char ch[CHUNKSIZE]; struct Chunk *next; }Chunk;typedef struct{ Ch原创 2021-02-27 00:46:24 · 130 阅读 · 0 评论 -
【数据结构与算法】队列的基本操作
队列:顺序队列 链式队列一般常用顺序循环队列空队标志:front == rear ,头指针和尾指针相等循环队列解决队满时判断方法:少用一个元素空间(rear+1)%MAXQSIZE==front循环队列的类型定义#define MAXQSIZE 100 //最大队列长度typedef struct{ QElemType *base; //动态分配存储空间 int front; //头指针,若队列不空,指向队列头元素 int rear; //尾指针,若队列不为空,指向.原创 2021-02-26 00:51:55 · 276 阅读 · 0 评论 -
【数据结构与算法】链栈的基本操作
1.链栈的初始化void InitStack(LinkStack &S){ S=NULL; return OK; }2.判断链栈是否为空Status StackEmpty(LinkStack S){ if(S==NULL) return TRUE; else return FALSE; }3.链栈的入栈Status Push(LinkStack &S,SElemType e){ p=new StackNode; //生成新结点p p->data=e;原创 2021-02-25 17:13:18 · 218 阅读 · 0 评论 -
【数据结构与算法】顺序栈的基本操作
顺序栈空栈:base== top栈满: top-base==stacksize1.顺序栈的初始化Statue InitStack(SqStack &S){ //构造一个空栈 S.base=new SElemType[MAXSIZE]; if(!S.base) exit(OVERFLOW); //存储分配失败 S.top=S.base; //栈顶指针等于栈底指针 S.stacksize=MAXSIZE; return OK; }2.判断顺序栈是否为空Statue Sta.原创 2021-02-24 22:05:26 · 296 阅读 · 0 评论 -
【数据结构与算法】顺序表和链表的比较
链式存储结构优点结点空间可以动态申请和释放;数据元素的逻辑次序靠结点的指针来指示,插入和删除时不需要移动数据元素。链式存储结构缺点存储密度小,每个结点的指针域需额外占用存储空间。当每个结点的数据域所占字节不多时,指针域所占存储空间的比重显得很大。链式存储结构是非随机存取结构。对任一结点的操作都要从头指针依指针链查找到该结点,增加了算法的复杂度。顺序表和链表的比较...原创 2021-02-23 00:23:56 · 108 阅读 · 0 评论 -
【数据结构与算法】单链表、循环链表、双向链表的基本操作实现
单链表的初始化(带头结点的单链表 )构造一个空表Status InitList L(LinkList &L){ L=new LNode;//或L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; return OK;}扩展:判断链表是否为空int ListEmpty(LinkList L){//若L为空表,则返回1,否则返回0 if(L->net) //非空 return 0; else .原创 2021-02-22 23:22:13 · 603 阅读 · 0 评论