本文字数:2000字 阅读本文大概需要:5 分钟 做算法题了,题的难度我们分为“士,尉,校,将”四个等级。这个算法题的模块是篇幅比较小的那种模块。...首先是给出一道题的描述,之后我会用我的想法来做这道题,今天算是算法题的第一道题,先来试试水。...显然,max=5左边的窗口实际上是不必再遍历的了,也就是它不可能会是窗口的最大值。 而 max = 5 右边的 4 有可能会是窗口的最大值吗?...由于窗口还会一直向右移动,所以 max = 5 右边的窗口元素还是有可能是某一个窗口的最大值的。 因此,我们可以用一个双向的队列,来记录有可能成为窗口最大值的下标,注意,这里指的是有可能。...像刚才的 max = 5 前面的 1,3 就不可能成为窗口的最大值了,而右边的4还是有可能成为窗口的最大值的。
这里涉及到了堆结构,作为引入,要先讲讲一种特殊的树结构——完全二叉树 完全二叉树 完全二叉树就是像下图一样的二叉树,所有叶结点的深度相同,并且所有内部结点都有两个子结点 看这个图就很好理解什么叫完全二叉树了...有了上面生成完全二叉树的基础,我们就能根据最大堆的性质来生成最大堆。...由于完全二叉树每一层的结点数量最大是上一层的两倍,所以,我们只需要从结点id为H/2的结点开始,终点是结点id=1的结点,都进行一遍max_Heapify就可以生成最大堆了。...生成最大堆的代码实现 题目来源: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?...我们只需要把上面的生成最大堆的代码稍加修改,就能改成生成最小堆的代码。
而在实际生活中的许多问题都是通过转化为图的这类数据结构来求解的,这就涉及到了许多图的算法研究。 例如:在 n 个城市之间铺设光缆,以保证这 n 个城市中的任意两个城市之间都可以通信。...最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。 3 普里姆算法—Prim算法 普里姆算法(Prim算法)是加权连通图里生成最小生成树的一种算法。...(4)最终,所有记录的最短距离的边构成的树,即是最小生成树。 3.2 算法图解 例如:图3.2.1所示的带权无向图,采用Prim算法构建最小生成树过程如下。...5 Boruvka算法 Boruvka算法是最小生成树算法中最为古老的算法。类似于Kruskal算法,Bruvka算法也是逐步添加子树的方式构建。...6 基于权矩阵的最小生成树算法 徐建军、沙力妮等发表了一篇一种新的最小生成树算法文章。此算法是从最小生成树的性质出发,通过构造权矩阵的方式来得到图的最小生成树。
分析: 本题首先需要理解清楚最大间隔的最小: 最初的间隔为:[1,1,4,1],此时最大间隔为4 删除2后的间隔为:[2,4,1],此时最大间隔为4 删除3后的间隔为:[1,5,1],此时最大间隔为5...删除7后的间隔为:[1,1,5],此时最大间隔为5 在删除元素后的间隔为:[4,5,5],最小值为:4 方法: int get_min_max_margin(int *a, const int n) {...i++) { int margin = a[i+1] - a[i]; // 计算当前的间隔 if (margin > max_ori) max_ori = margin;// 纪录所有最大的间隔
又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。 这道题很活灵活现,需要加深对题意的变相理解。...一、题目描述 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。...经过上面的题意转换,我们可知本题是求最大连续子区间,可以使用滑动窗口方法。滑动窗口的限制条件是:窗口内最多有 K 个 0。 可以使用我多次分享的滑动窗口模板解决,模板在代码之后。...滑动窗口长度的最大值就是所求。 2.2 滑动窗口解题模板 滑动窗口算法是一种常用的算法,用于解决数组或列表中的子数组问题。...下面是一个具体的例子,使用滑动窗口算法求解数组中连续子数组的最大和: def maxSubArray(nums): if not nums: return 0
= "CODE" 输出:"" 提示: 1 <= str1.length, str2.length <= 1000 str1 和 str2 由大写英文字母组成 二、题解 2.1 方法一:辗转处理 思路与算法...如果最后或者过程中,str1不等于str2,则没有最大公因子 第一种情况例如: ABCABC ABC 减一次 ABC ABC 减第二次 " "..." " AB 保证str1的长度大于str2 AB " " ------->ABC 2.2 方法二:gcd 算法...gcd 算法:const gcd = (a, b) => (0 === b ?...= 0) return ""; return gcdOfStrings(str1.substr(str2.length()), str2); } }; 3.2 方法二:gcd 算法
算法1:暴力法 int MaxSubseqSum1(int A[], int N) { int ThisSum, MaxSum = 0; int i, j, k; for( i...MaxSum = ThisSum; } } } return MaxSum; } // T(N) = O(N^3) 算法...> MaxSum) MaxSum = ThisSum; } } return MaxSum; } // T(N) = O(N^2) 算法...3:二分法 //返回3个整数中的最大的一个 int getmaxint3(int a,int b,int c) { return a>b?...的结果 */ return getmaxint3( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum ); } 算法
Kruskal算法 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法 大话数据结构定义 假设 。图中每个顶点自成一个连通分量。...以上图G4为例,使用克鲁斯卡尔算法进行演示实现最小生成树,用parent表示 第零步: 将邻接矩阵转换为边表数组,并且按权值大小排序 第一步: 将边加入最小生成树中 边的权值最小,故将其加入最小生成树...终点即在最小生成树中与它连通的最大顶点。每次添加一条边到最小生成树中时,判断该边的两个顶点的终点是否重合,重合则构成回路。...在将加入到最小生成树中后,这几条边的顶点就都有了终点 C的终点是F D的终点是F E的终点是F F的终点是F 关于终点,就是将所有顶点按照从小到大的顺序排列好之后;某个顶点的终点就是”与它连通的最大顶点...虽然边权值最小,但终点都是F, 故会形成回路 Kruskal算法代码 Edge边集数组结构 typedef struct { int begin; int end; int weight
求无向网的最小生成树的算法有两种:Prim和Kruskal,它们都是利用最小生成树的MST性质得到的。 Prim算法思想: 逐渐长成一棵最小生成树。...假设G=(V,E)是连通无向网,T=(V,TE)是求得的G的最小生成树中边的集合,U是求得的G的最小生成树所含的顶点集。初态时,任取一个顶点u加入U,使得U={u},TE=Ø。...最后得到的T=(V,TE)就是G的一棵最小生成树。也就是说,用Prim求最小生成树是从一个顶点开始,每次加入一条最小权的边和对应的顶点,逐渐扩张生成的。 我们举一个例子?
前言 EK算法是求网络最大流的最基础的算法,也是比较好理解的一种算法,利用它可以解决绝大多数最大流问题。...但是受到时间复杂度的限制,这种算法常常有TLE的风险 思想 还记得我们在介绍最大流的时候提到的求解思路么? 对一张网络流图,每次找出它的最小的残量(能增广的量),对其进行增广。...没错,EK算法就是利用这种思想来解决问题的 实现 EK算法在实现时,需要对整张图遍历一边。 那我们如何进行遍历呢?BFS还是DFS?....^#) 所以我们选用BFS 在对图进行遍历的时候,记录下能进行增广的最大值,同时记录下这个最大值经过了哪些边。...通过上图不难看出,这种算法的性能还算是不错, 不过你可以到这里提交一下就知道这种算法究竟有多快(man)了 可以证明,这种算法的时间复杂度为 大体证一下: 我们最坏情况下每次只增广一条边,则需要增广
12、15、18的最大公约数是3,记为(12,15,18)=3。 二、实现最大公约数的算法 2.1 辗转相除法,又称欧几里德算法 辗转相除法又称欧几里德算法,是用来求两个正整数最大公约数的算法。...它是古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。 定理:两个正整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。...gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0) 欧几里得的辗转相除算法是计算两个自然数最大公约数的传统算法,对于多个自然数可以执行多次辗转相除法来得到最大公约数...流程图如下: 2.2 Stein算法 Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对大整数进行运算时,需要试商导致增加运算时间的缺陷而提出的改进算法。...7 更相减损法最早是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
数据结构算法操作试题(C++/Python):数据结构算法操作试题(C++/Python)——目录 ---- 1.
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。...2.1 滑动窗口含义 滑动窗口算法是一种在数组或列表中寻找特定元素的强大工具,可以高效地解决一系列问题。 例如找到一个数组中最大的K个元素、在一个数组中查找子数组的数量等等。...2.2 滑动窗口一般解法 滑动窗口算法是一种常见的算法技巧,用于解决一些数组或字符串相关的问题。...应用场景: 最小/最大子数组/子字符串:寻找给定数组或字符串中满足特定条件的最小或最大的子数组或子字符串。 字符串匹配:在一个字符串中寻找另一个字符串的出现或满足特定条件的子串。...在移动窗口时,要更新窗口内的元素和相应的数据结构,以确保窗口的正确性。 重复步骤2到步骤4,直到遍历完整个数组或字符串,返回解或所需的结果。
问题分析:在数组的每一个位置处保存当前的最大值,当前的最大值组成为: image.png 解决方案: int get_max_subarray(int *a, int length, bool &is_array_ok
leetcode 链接:https://leetcode-cn.com/problems/generate-parentheses/submissions/
我们要使剃边花费最小,那么就要使剃边后剩下的无向无环图的边权和最最大,因为剔除环中最小边,不能保证提出的和最小,所以一遍最大生成树。
基本概念 生成树 给定一个带权的无向连通图,能够连通该图的全部顶点且不产生回路的子图即为该图的生成树; 极小连通子图 一个连通图的生成树是一个极小连通子图,它含有图中全部N个顶点且只有足以构成一棵树的N...-1条边; 最小生成树 (简称MST) 给定一个带权的无向连通图,如何选取一棵生成树,使得树上所有边的权总和最小,这棵生成树就叫做最小生成树; 给定N个顶点的无向连通图,其最小生成树一定有N-1条边;...最小生成树中含有N个顶点; 最小生成树中的N-1条边都在给定的无向连通图中; 问题引出 首先看这样一个场景: ?...连通起来时,我们选择的下一条边应该是 中最短的那条,即 ,将B与A–G连通; prim算法介绍...普利姆(Prim)算法求最小生成树,就是在给定含有N个顶点的带权无向连通图中,找出包含N个顶点且只有N-1条边的连通子图,也即常说的极小连通子图,并保证该子图的权值和最小 普利姆算法思路: 1)设G
无限级分类树状结构的应用场景很多,例如后端研发需要把用户相关权限读取出来并生成树状结构,前端研发拿到权限树之后可以按照结构展示用户有权限访问的栏目;再例如网页上的栏目分级: 作者在初次接触树状结构生成需求的时候...,也是挠头,后来找到了一个代码少且清晰易懂的生成算法:递归。...电吹风条目跟电器条目并无直接的标识进行关联,但需要用树状结构来表明 电器 <- 家用电器 <- 电吹风 的关系。...递归算法中有很多重复的计算,这些计算不仅占用额外资源,还会降低函数执行效率,因此需要对递归进行优化。...= generate_tree(source, item["id"], cache) tree.append(item) return tree 至此,无限级分类树状结构生成算法完成
给出一个图,要求出最大的pseudoforest, 所谓pseudoforest就是指这个图的一个子图,这个子图的每个连通分量中最多只能有一个环, 而且这个子图的所有权值之和最大。...过程类似与kruskal求最小生成树,千万不要直接求最大生成树,一开始时我想到的方法是用kruskal算法求出这个图的最大生成树, 然后给每一棵数再加上一条最大的边,构成一个环。...正确的做法和求最大生成树很类似,但是有一点改变, 因为每个连通分量允许有一个回环, 所以,我们可以在进行合并两颗树时,要判断这两颗树是否有回环,如果两个树都有回环,那么明显不可以合并这两颗树, 如果只有一棵树有回环...代码: 1 // hdu 3367 最大生成树 2 // author: Gxjun 3 // date: 2014/11/18 4 #include 5 #include
返回你可以对数组执行的最大操作数。...但按理说排序的时间复杂度是大于 hash 的,但是他的代码效率反而更高,说明 hash 算法的效率太低,或者冲突严重。...2.1 方法一:双指针排序 思路与算法: 1. 首先先将数组排序,在设定左右指针 i 和 j ,分别指向数组的头和尾。 2.
领取专属 10元无门槛券
手把手带您无忧上云