
Algorithm|由浅入深学算法
文章平均质量分 89
以理论为支撑,力求以简单的语言去由浅入深讲清算法背后的原理,将其进行总结,成为做题的基本思路和框架;从刷题实践中去熟练应用各个算法~
是瑶瑶子啦
旦旦而学之
展开
-
【算法设计与分析】知识点总结、大学期末复习
算法(Algorithm)算法是解决问题的一种方法or一种过程具体组成: 若干指令的有穷序列。有以下四个性质是算法解决问题的对象,即外部提供的量作为算法的输出算法解决问题的结果,即算法至少输出一个值。每条指令的含义是没有歧义的(即我们需要的是一个确定的明确的无歧义的解决方法)。每条指令执行的次数、时间是有限的。即在有限时间内,这个问题肯定有解。数值概率算法:通过多次随机试验,得到近似解,适用于复杂问题。舍伍德思想:通过随机化方法解决特定问题,逐步逼近最优解。拉斯维加斯算法。原创 2024-08-22 11:12:52 · 18969 阅读 · 3 评论 -
【BFS算法】广度搜索·由起点开始逐层向周围扩散求得最短路径(算法框架+题目)
深度优先搜索是DFS(Depth Frst Search),其实就是前面所讲过的回溯算法,它的特点和它的名字一样,首先在一条路径上不断往下(深度)遍历,获得答案之后再返回,再继续往下遍历。这也是递归的思想,所以这也是为什么回溯算法通常都是用递归来写,而下面的BFS由于不是这种思路从而没有用递归。广度优先算法(Breath First Search)其实和深度优先算法是一对兄弟,因为它们的解空间都是树形解空间,并且都是在求解过程中动态生成树形解空间。原创 2024-06-19 09:57:57 · 1573 阅读 · 0 评论 -
【最小生成树】一文学懂prim、kruskal算法
首先,我们要了解什么是最小生成树🌠树and图?其实树也是一种特殊的图;无向、无环、联通图,就是树。🌳最小生成树求最小生成树,简单来说,就是让组成图的顶点,根据现有的边的关系,从图转换成一个特殊的图——树,光转换成树还不行,还要时这个特殊的图的所有边的权重加起来最小!这就是所谓的求最小生成树。原创 2023-03-31 21:40:17 · 1502 阅读 · 36 评论 -
【最短路算法】第三弹:一文学懂spfa 算法(队列优化的Bellman-Ford算法)
前面,我们分别介绍了Dijkstra算法(【最短路算法】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解)和Bellman-Ford算法【最短路算法】第二弹:一文弄懂Bellman-Ford(贝尔曼福特算法)前者用于求单源、正权边最短路问题,后者用于求单源、带负权边最短路问题。通过对Bellman-Ford算法讲解,我们知道,Bellman-Ford算法美中不足的一点在于时间复杂度是O(nm),时间复杂度过高。今天,我们学习的spfa算法,优化了Bellman-Ford算法,原创 2023-03-30 18:10:40 · 943 阅读 · 54 评论 -
【二分图算法】手把手教你学会:染色法(判断二分图)、匈牙利算法(二分图的最大匹配)
就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。(不一定是连通图)💡匹配(本质是一个边的集合!给定一个二分图S,在S的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。💡极大匹配极大匹配是指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数。(也就是说,再加入任意一条不在匹配集合中的边,该边肯定有一个顶点已经在集合中的边中了)💡最大匹配。原创 2023-04-01 16:37:25 · 3672 阅读 · 11 评论 -
【最短路算法】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解
Dijkstra算法适用于最短路问题中,单源最短路(只有一个起点),并且每条边的权重都是正数的情况。原创 2023-03-26 21:06:16 · 4884 阅读 · 74 评论 -
【最短路算法】第二弹:一文弄懂Bellman-Ford(贝尔曼福特算法)
【最短路算法】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解Dijstra算法用于计算单源正权边的最短路问题今天学习的贝尔曼福特算法,是用于计算单源,且可含负权边的最短路问题用于求解单源、有负权边的最短路问题实现通过m次迭代求出从起点到终点不超过m条边构成的最短路径其优于Dijkstra的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高。原创 2023-03-28 21:35:44 · 19988 阅读 · 80 评论 -
【回溯算法】N皇后问题·构建多叉决策树,遍历决策节点,做出决策(边),收集答案
在这篇博客,其实已经对回溯算法的思想、做题框架做出了详细的阐述。这篇文章我们再从N皇后问题,加深我们对其理解。这里在简单再次对其进行概述:回溯算法的核心就是构建和遍历一棵【多叉决策树】🪧函数就相当于游走在这颗多叉决策树上的一个指针,它来决策节点,并且做出决策。进入backtrack函数,就以为着我们进入了一个决策节点,也意味着我们需要思考上面所示的三个问题。其核心就是 for 循环里面的递归,原创 2024-06-07 13:20:42 · 1233 阅读 · 1 评论 -
【贪心算法·哈夫曼编码问题】从定长编码和不定长编码讲到最小化带权路径长度和
原问题有n个节点,通过贪心选择合并两个频率最低节点为一个新节点,将新节点加入到节点集合,进行n-1个节点的最优编码二叉树构建,可以看到,首先我们要承认使用贪心的前提是:问题具有贪心选择性质,即可以通过局部最优进而得到全部最优(并不是所有问题都具有贪心选择性质);而由局部最优得到全局最优其实是一个自顶向下的思想过程:通过每次当前的贪心选择,来缩小问题规模,从而一步一步得到全局最优解。原创 2024-06-03 17:26:16 · 3453 阅读 · 0 评论 -
由树形解空间入手,深入分析回溯、动态规划、分治算法的共同点和不同点
回溯、动态规划、分治可以认为是一类算法,其实不用严格的将其分为太开,它们的共同点是解空间都是一棵多叉树,获得解也是在这个多叉树上进行操作。只需要从这三个视角对其有一个直观认识即可而各个算法的关键以及区分点也就是❓如何去构建这样一给解空间(一颗多叉树)——递归函数的定义❓这个多叉树的节点含义是什么❓如何基于这个解空间获得问题的答案。原创 2024-05-08 16:49:37 · 1086 阅读 · 0 评论 -
【Leetcode每日一刷】二维数组花式遍历:一、顺/逆时针旋转矩阵 :48. 旋转图像、二、矩阵的螺旋遍历 |54. 螺旋矩阵
寻常的思路有以下两种:可能会误认为去模拟一下,一圈一圈的去遍历,然后进行旋转;又或者是想去找出当前坐标和旋转后像素对应坐标位置之间的关系,结果发现都想不出来很好的解决方法。它用了另外一种比较巧妙的方法,对于计算机比较好理解,但对于我们可能一下子想不到的方法去解决了。(对于这种题,只要有个印象,以后遇到类似题目就不会懵圈了。这题的意思很简单,就是让我们把矩阵。不可暴力模拟,先镜像,后水平翻转。❗❗核心思想/ 关键。原创 2024-03-14 16:12:20 · 971 阅读 · 0 评论 -
【Leetcode每日一刷】滑动窗口:209.长度最小的子数组
更新当前窗口中的数据情况,再拿去和题目所需的可行解进行比对,判断当前窗口内的情况是否可行!找到一个可行解&更新得到一个可行解后,对题目最终需要的最优答案进行更新!🪧 滑动窗口本质也是双指针的一种技巧,特别适用于。左右指针滑窗口,一前一后齐头进。注意下面框架中的6个关键点!,等会你会发现它们操作是完全。本题思路(依据算法框架)❗❗核心思想/ 关键。原创 2024-03-10 21:19:57 · 976 阅读 · 0 评论 -
【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)
当有可能含负数的有序数组平方后,最大值只有可能位于数组两侧,整个数组呈一个凹函数,从两边向中间递减。但是这题的关键如上,也就是平方后数组由两边向中间递减,最大值只有可能位于两侧。由于这样的特性,利用。,每次循环,将左指针和右指针处的元素进行比较。更新当前窗口中的数据情况,再拿去和题目所需的可行解进行比对,判断当前窗口内的情况是否可行!双指针, 从两边向中间探测,互相比较,逐渐挑出最大值,再到次最大值…——两者的情况进行比对,判断当前窗口中的情况是否可行。完全一样时,就可行,换句话说,就是不能直接把。原创 2024-03-09 12:49:34 · 1047 阅读 · 0 评论 -
【Leetcode每日一刷】数组|704. 二分查找、27. 移除元素
【易错】二分查找的重点就划分区间、逐渐缩小、两边夹,关于划分区间这题第二个代码我用的划分为[left,mid]和[mid+1,right],为什么不是**[left,mid-1]和[mid,right]**呢?—因为会容易出现死循环使用和public:right : -1;【重点】二分法的关键是缩小区间,死循环发生的原因是某次循环没有缩小区间导致二分失败。【重点】此题right设置为的原因是array.length也有可能是问题答案【重点】将二分查找的判断条件写成。原创 2024-03-06 19:56:23 · 1139 阅读 · 0 评论 -
【Leetcode每日一刷】贪心算法| 45.跳跃游戏 II
这题还是比【55.跳跃游戏】难一些的。第一个版本只是说,求跳跃的范围,覆盖到了终点即可。这题则是,能保证覆盖范围到达终点,求的是最少跳几次,跳到终点。这题的话也是偏直觉,最好能一步到就好,一步到不了,两步能到吗?两步还到不了,三步呢?听起来是不是还挺简单的?但是实现起来,还是有一些需要考虑的。明白了大致思路,但是实现起来还是有问题,我们再来捋一下思路。原创 2024-03-05 21:46:52 · 1113 阅读 · 0 评论 -
【Leetcode每日一刷】贪心算法|122.买卖股票的最佳时机 II、55. 跳跃游戏
🦄解题思路:;这是正确的直觉:没错,很有道理,但是我想到了一个反例:如下图,如果按照上面的思路,则第一个元素买入,第二个元素卖出;遍历到第二个元素时,由于已经卖出,按理来说不能再操作了,但是由于当前元素低于第三个元素,还应该买下第二个元素,这样似乎违法了每天只能有一个操作的前提。但是后来看了一些题解,发现这种情况根本不影响,虽然正确情况的:第 0 天买入,第 2 天卖出,那么利润为:prices[2] - prices[0]。原创 2024-03-01 21:01:49 · 963 阅读 · 0 评论 -
【Leetcode每日一刷】哈希表|纲领、242.有效的字母异位词、349. 两个数组的交集
下面针对做题要用到的三种结构讲一下(也是重复造轮子了算是)常见的三种哈希结构当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。unordered_set在C++11的时候被引入标准库了,而hash_set并没有,所以建议还是使用比较好,这就好比一个是官方认证的,hash_set,hash_map 是C++11标准之前民间高手自发造的轮子。🦄总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。原创 2024-02-29 21:56:17 · 1136 阅读 · 0 评论 -
【Leetcode每日一刷】动态规划算法: 62. 不同路径、63. 不同路径 II
前言:动规五部曲以下是《代码随想录》作者总结的动规五部曲确定dp数组(dp table)以及下标的含义确定递推公式(状态转移方程)dp数组如何初始化确定遍历顺序举例推导dp数组所有动态规划问题中,一个状态一定由上一个状态推导而来,这点就有别于贪心,贪心没有状态的推导更别说什么公式,贪心只是从局部选取最优解。例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。原创 2024-02-29 21:09:54 · 1040 阅读 · 0 评论 -
【Leetcode每日一刷】贪心算法01:455.分发饼干、376. 摆动序列、53. 最大子序和
代码随想录贪心算法并没有任何套路,它的本质是寻找局部最优解。严格的数学证明为以下两者数学归纳反证前者基本上是劝退了,反证就是看能不能对你想出的这种算法or模拟举出反例。与其叫贪心,我个人现在更愿意将其理解为模拟,偏常识形式的,没有一个统一的套路。可以从下面的题目中看出。原创 2024-02-28 20:19:57 · 1275 阅读 · 1 评论 -
【Leetcode每日一刷】动态规划:931. 下降路径最小和
动规五部曲就是说你可以站在 matrix 的第一行的任意一个元素,需要下降到最后一行。每次下降,可以向下、向左下、向右下三个方向移动一格。也就是说,可以从 降到 或 或 三个位置。从第一行(matrix[0][…])向下落,落到位置 matrix[i][j] 的最小路径和为 dp(matrix, i, j)。写出主体逻辑代码:2、确定递推公式(递推函数的实现)对于 ,只有可能从 , , 这三个位置转移过来那么,只要知道到达 , , 这三个位置的最小路径和,加上 的值,就能够计算出来到达位原创 2023-04-27 09:24:13 · 1028 阅读 · 2 评论 -
【Leetcode每日一刷】动态规划:509. 斐波那契数、322. 零钱兑换、300. 最长递增子序列
1. 确定dp数组(dp table)以及下标的含义2. 确定递推公式(状态转移方程)3. dp数组如何初始化4. 确定遍历顺序5. 举例推导dp数组原创 2023-04-23 21:34:38 · 603 阅读 · 0 评论 -
【Leetcode每日一题】844. 比较含退格的字符串|重构字符串/双指针
昨天的【Leetcode每日一题】27. 原地移除元素|神级理解双指针一文中,生动形象的为大家讲解如何理解双指针,受到了很好的反馈,今天趁热打铁,瑶瑶子为大家带来一道双指针的plus版本题目,会比昨天的难一点,但是本质和逻辑是一样的(就是两个人干活,男女搭配,干活不累!)原创 2023-01-29 22:34:01 · 2516 阅读 · 41 评论 -
【Leetcode每日一题】27. 原地移除元素|神级理解双指针
双指针\快慢指针原来这么简单?一篇文章带你形象体会双指针!原创 2023-01-28 19:30:10 · 3023 阅读 · 43 评论 -
【Leetcode每日一题】69. x 的平方根/Sqrt(x)|二分查找---day3
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。原创 2023-01-25 23:48:04 · 1559 阅读 · 26 评论 -
【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。原创 2023-01-25 08:00:00 · 1675 阅读 · 38 评论 -
【Leetcode每日一题】35.搜素插入位置|二分查找数组下标
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n)原创 2023-01-23 19:01:13 · 2613 阅读 · 67 评论 -
【寒假刷题篇】--03
🥫写刷题篇的初衷一方面是记录自己做的题,这是最片面的,最重要的是记录和分享自己从这个题目的收获,一些关于题目的思想。🎋也许下面的题不一定很多,也不一定都很难,也不一定很高深,但是我认为做题不是为了做题而做题,而是从这个题目当中获得了什么,有没有积累到知识,有没有学到思维,学到方法。如果有,那么我觉得是这个题做的是值得的。所以对待我所做的每个题我都格外珍惜,让自己每次都不白白的做一道题。🚎刷的题目数量不定,目的是每天有敲代码,有所收获。原创 2023-01-06 23:36:25 · 380 阅读 · 4 评论 -
【寒假刷题篇--02】
n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。输出为一行,如果序列有序输出sorted,否则输出unsorted。输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。第二行输入N个整数,用空格分隔N个整数。第二行包含n个整数,用空格分隔。原创 2023-01-05 22:52:25 · 420 阅读 · 6 评论 -
【寒假刷题篇】--01
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。💘解法1:利用switch-case语句实现(利用了case只作为入口的特点,实现了累加)🗼解法2:利用数组,存储每个月对应的天数,再根据月份来累加天数,原理和解法1一样。进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(1)\O(1)输入一行,每行空格分割,分别是年,月,日。根据输入的日期,计算是这一年的第几天。n位数的最大数位:10^n-1。✨vector容器的使用。原创 2023-01-04 19:53:07 · 527 阅读 · 1 评论