算法
程序员迪迦
【我是谁?】本人23届双非普本毕业,在互联网寒冬中通过秋招收到多家大厂的录用offer:快手、米哈游、京东、滴滴等,经历过几十次的大厂面试,实习和秋招面试经验充足。【目的是?】在我的成长过程中,许多前辈大佬帮助过我,我也真诚的希望能给大家带来一些帮助,关注我,进大厂不迷路!
展开
-
快速排序随机选取主元的重要性
在刷力扣215题 数组中的第K个最大的元素时,发现了快速排序随机选取主元的重要性,不然就会被极端的数据把时间复杂度卡到n²。两种选取主元的时间差异很大我又试了试调用库函数,发现和我自己写的快速排序时间复杂度差不多...原创 2021-05-19 12:03:44 · 628 阅读 · 0 评论 -
快速排序(思想以及详细代码)
思想快速排序是对冒泡排序的一种改进,冒泡排序每次将未排序的数组中最大的一个数通过交换的方式放到正确的位置上,而快速排序是选取一个中轴元素,然后把数组中所有小于中轴元素的元素放在其左边,所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是有序的。也就是说,我们无需再移动中轴元素的位置。动图演示如下:(动图取自微信公众号:帅地玩编程)如何使中轴元素位于正确的位置由于中轴元素左边的值都比它小,右边的值都比它大,所以采用双指针的方法同时维护两个数组,左边维护一个比它小的数组,右边维护一原创 2021-05-09 17:15:13 · 132 阅读 · 0 评论 -
最小生成树问题(Prim算法和Kruskal算法的异同总结)
什么是最小生成树?是一棵树*无回路*V个顶点一定有V-1条边是生成树*包含全部顶点边的权重值之和最小结论:只要图是连通的,则存在最小生成树,同理,只要有最小生成树,图就连通。核心算法思路:贪心贪心算法的约束条件:只能用图里有的边只能正好用电V-1条边不能有回路...原创 2020-09-22 17:39:48 · 2947 阅读 · 0 评论 -
最短路径问题(最全面的问题分类以及算法源码)
最短路径问题的抽象:在网络(带权的图)中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。问题分类:单源最短路径问题:从固定顶点出发,求其到所有其他顶点的最短路径。多源最短路径问题:求任意两顶点间的最短路径。无权图的单源最短路算法:...原创 2020-09-20 17:18:42 · 5632 阅读 · 0 评论 -
图的遍历(邻接表和邻接矩阵)
图的遍历是什么?从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。深度优先遍历(DFS):它从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v 有路径相通的顶点都被访问到。(类似树的先序遍历)/*邻接矩阵的dfs*/bool visited[Maxvex];memset(visited,false,sizeof(visited));//初始化void dfs(MGraph G,int i){ cout&原创 2020-08-23 15:23:08 · 667 阅读 · 0 评论 -
图--基本概念及源码表示
什么是图?表示多对多的关系怎么在程序中表示图?邻接矩阵邻接表邻接矩阵邻接矩阵G[N][N]——N个顶点从0到N-1编号 ,若v[i][j]==1,则(i,j)是一组边。优点:1 :方便检查任意一对顶点间是否存在边2: 方便找任一顶点的所有“邻接点”3: 方便计算任一顶点的“度”(从该点发出的边数为“出 度”,指向该点的边数为“入度”)邻接表G[N]为指针数组,对应矩阵每行一个链表, 只存非0元素,每条链表上都是根N相邻的元素。优点:1 :方便找任一顶点的所有“邻接点”2:原创 2020-08-20 15:34:13 · 205 阅读 · 0 评论 -
判断不同的序列是否是同一棵搜索树?
题意理解 :给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。 例如,按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树, 都得到一样的结果。问题:对于输入的各种插入序列,你需要判断它们是否能 生成一样的二叉搜索树。输入样例:4 23 1 4 23 4 1 23 2 4 12 12 11 20输出样例:YesNoNo求解思路两个序列是否对应相同搜索树的判别 :1.分别建两棵搜索树的判别方法2原创 2020-07-27 10:41:05 · 222 阅读 · 0 评论 -
平衡二叉树的原理与实现
什么是平衡二叉树?搜索树结点不同插入次序,将导致不同的深度和平均查找长度ASL,而平衡二叉树就是一颗任意一个结点的左右子树高度的差的绝对值不超过1的搜索二叉树。附一个大佬写的图解:图解平衡二叉树平衡二叉树的四种基本情况和操作:左-左型:右旋右-右型:左旋左-右型:先左旋再右旋右-左型:先右旋再左旋struct AvlNode { int data; AvlNode lchild; AvlNode rchild; int height;//记录结点的高度}int Height原创 2020-07-18 14:41:03 · 161 阅读 · 0 评论 -
二叉搜索(查找)树的原理与实现
查找分为两种查找静态查找动态查找二叉查找树就是针对动态查找的一种数据组织的方式二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:非空左子树的所有键值小于其根结点的键值。非空右子树的所有键值大于其根结点的键值。左、右子树都是二叉搜索树。二叉搜索树操作的特别函数:Position Find( ElementType X, BinTree BST ):从二叉搜索树BST 中查找元素X,返回其所在结点的地址;Position FindMin( BinTree BST ):从二叉原创 2020-07-16 10:37:07 · 575 阅读 · 0 评论 -
树的同构(静态链表表示二叉树的应用)
例:给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子原创 2020-07-15 15:48:59 · 448 阅读 · 0 评论 -
由两种遍历序列确定二叉树(多种方法及其优化方法)
若已知任意两种遍历序列,是否可以唯一确定一颗二叉树?答:只要这两种序列包含一个中序序列就可以。为什么一个先序和一个后序序列无法确定?答:先序 根左右后序 左右根若一棵树,其中一个或多个结点的左子树或右子树为空,那么此时无法判断到底是左子树为空还是右子树为空,就会出现两种情况。例:先序和中序遍历序列来确定一棵二叉树解法: 根据先序遍历序列第一个结点确定根结点; 根据根结点在中序遍历序列中分割出左右两个子序列 对左子树和右子树分别递归使用相同的方法继续分解。注意:你可以假设树中没有原创 2020-07-15 10:56:17 · 6847 阅读 · 0 评论 -
一元多项式的乘法
eg:设计函数求两个一元多项式的乘积。输入样例 :4 3 4 -5 2 6 1 -2 03 5 20 -7 4 3 1(一共两行,每行第一个数字代表项数,后面每两个两个一组,前面是系数,后面是指数)输出样例:15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1求解思路:多项式表示(数组或链表)程序框架读多项式乘法实现多项式输出本题由于输入样例提供了项数,故用动态数组解决较好,下面展示链表的解决方法。链原创 2020-07-06 16:25:54 · 2046 阅读 · 0 评论 -
秦九韶算法计算多项式
方法1:直接模拟累加。题目条件:n为最高的次数,a数组为系数,x为给定的值。double f(int n,double a[],double x){ int i; double p=a[0]; for(i=1;i<=n;i++) p+=(a[i]*pow(x,i)); return p;}方法二:根据秦九韶算法:可转化为:故我们可以从内往外递推的计算多项式的值。double f(int n,double a[],double x)原创 2020-06-16 16:03:27 · 7883 阅读 · 0 评论 -
递推的高精度斐波拉契
高精度斐波拉契数列题目:洛谷P1255 数楼梯楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。输入格式:一个数字,楼梯数。输出格式:走的方式几种。输入4输出5说明/提示60% N<=50100% N<=5000)思路:数楼梯问题其实就是斐波拉契数列的问题,一开始用int类型递推,对了40分,然后改用longlong,对...原创 2020-03-06 10:56:32 · 208 阅读 · 0 评论