算法
c栈算法小辰哥
华中农学院的大二计科,陪伴和爱着每一个支持我和帮助我的人
展开
-
华农专业课拯救计划:csf202303
聊聊心路历程:这道题首先看见一堆公式就头大了,但是看到题干就想当一个贪心的男人,首先选择贪心策略(也没啥选的):把资源给天数的最多的,再选择map作为存储器,也可以用vector<pair>加迭代器排序,但是我想用map因为懒得写迭代器排序,首先这是一个降序排序,原因是根据贪心策略要开始从天数多的开始,在有资源且最低天数大于k的时候进行,首先看一看能不能给天数多的降一个档,能就更新一下各种变量,头删一下,不能降档就算一下能减几天,如果一开始就满足要求,就打印最多的天数。第三题(我不会,我不会......)原创 2024-10-06 10:59:38 · 193 阅读 · 1 评论 -
漫话算法:最短路径迪特拉斯算法
【代码】漫话算法:最短路径迪特拉斯算法。原创 2024-05-14 22:57:27 · 191 阅读 · 3 评论 -
华农专业课拯救计划:普利姆算法
为什么这个搞不定?原因就在于遍历的方式上,第二种路径更为完整,第一种会缺东西。原创 2024-05-12 08:52:40 · 265 阅读 · 3 评论 -
华农专业课拯救计划:窗口问题(数据结构第9周实验)
【问题描述】在某图形操作系统中,有N个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。现在我们希望你写一个程序模拟点击窗口的过程。【输入形式】输入的第一行有两个正整数,即N和M。原创 2024-05-12 08:34:06 · 469 阅读 · 3 评论 -
图的最小生成树算法:普利姆算法(c++实现)
首先是找合适顶点的函数,首先传过来的是某一个顶点的关系(零阶矩阵的一行),遍历这个顶点的关系,找出权重最小的顶点进行返回,接着是普利姆算法的主要函数,数组key存储的是边到生成树顶点的距离,起到判断的作用,首先将顶点入树,然后开始找边(最小生成树如果有n个顶点则会有n-1条边,这里的mstsize为一个计数器),然后从第一个顶点开始寻找最小顶点,如果找不到则图不连通,如果它没有入树则作为起始点打印,否则作为边打印,然后更新key,parent,以及visited的值。原创 2024-05-10 09:42:08 · 366 阅读 · 4 评论 -
漫话算法:二分查找(带你刷题版)
9.来总结一下:使用二分要先判断数组是否具有二段性,如果具有二段性,则选择找左或者找右的模板,并且观察如果出现了-1则算中的时候+1。这是一个明显的找左节点的问题,这个题注意一点,就是注意模板中left+(right-left+1)与mid-1的绑定。这个题的重点在于关系不一定是相邻元素,也可能是其他关系,比如最后一个元素,这一点可以通过样例观察得出。这个不是经典的有序数组,但是是一个二段性数组,这个找左或者找右模板都可以。这个二段性比较难发现,left与right是由峰顶的寻找移动的。原创 2024-05-06 20:26:45 · 350 阅读 · 4 评论 -
漫话算法:滑动窗口(带你刷题版)
这里也可以做一个优化,因为当p是一个字符串数组而不是单词时每次遍历必定会超时,所以采用以下方法进行优化,思路为只处理框框里的元素,统计有效元素,即p中出现次数大于s对应字母出现位置时,为有效位置,当窗口过大时,缩窗口,当窗口正好且有效元素符合时,判断成功。参考了前几题的算法,这个题的思路也不难出,但需注意几点,首先注意left的更新,当符合条件应该逐步入栈,并且要对出窗口的操作进行判断,并且,hash以后用map吧,要不然容易出问题,最后一点,恶心用例直接if else好吧。原创 2024-05-05 16:28:12 · 706 阅读 · 3 评论 -
漫话算法:双指针(带你刷题版)
笔者很好奇,此题不管有什么方法,都会用到起码四个位置的加法比较,笔者不知道为什么会传入这么大的几个数,这样加法是必然过不了的,除非这题也要使用大数加法的计算,而这种题要搞这种是很无语的,日前力扣更新了一下,避免使用long sum存储结果导致逃避大数加法的情况,服。算法思想:左右两个指针依次往内部移动,如果相遇则停止,每一步都计算体积并实时更新,移动方法:移动当前值最小的指针,因为此时内部的数据是固定的,如果容器的宽减小的情况下,容器的长要尽可能长才有超越原来体积的机会,所以我们此时选择让短边的指针移动。原创 2024-05-04 08:37:32 · 1025 阅读 · 3 评论 -
力扣记忆化搜索:最长递增子串
【代码】力扣记忆化搜索:最长递增子串。原创 2024-04-28 18:09:00 · 186 阅读 · 3 评论 -
力扣记忆化搜索:不同路径
2.记忆化搜索就是创建一个表用于记录数据,并且每一步都要操作表,返回也要从表中取。原创 2024-04-28 12:00:35 · 172 阅读 · 3 评论 -
力扣洪水算法:扫雷游戏
【代码】力扣洪水算法:扫雷游戏。原创 2024-04-28 04:13:52 · 182 阅读 · 4 评论 -
力扣洪水算法:太平洋大西洋水流问题
2.此处也运用了正难则反的思想,只找水可以最高到哪里。原创 2024-04-28 03:20:32 · 223 阅读 · 2 评论 -
力扣洪水算法:被围成的区域
2.此题采用了正难则反的思路,直接将靠边的情况单独处理,直接省去了大量的判断代码。原创 2024-04-28 02:20:53 · 224 阅读 · 6 评论 -
力扣洪水算法:岛屿的最大面积
【代码】力扣洪水算法:岛屿的最大面积。原创 2024-04-27 10:47:45 · 199 阅读 · 3 评论 -
力扣洪水算法:岛屿数量
【代码】力扣洪水算法:岛屿数量。原创 2024-04-27 10:12:36 · 235 阅读 · 3 评论 -
力扣洪水算法:图像渲染
【代码】力扣洪水算法:图像渲染。原创 2024-04-27 09:34:42 · 170 阅读 · 3 评论 -
那些年我们一起写过的代码3:回溯剪枝恢复现场
(+=不能用在表达式中)原创 2024-04-26 23:04:01 · 192 阅读 · 3 评论 -
漫话算法:一文带你搞懂递归回溯剪枝恢复现场暴搜
1.在力扣中,我们一般都按标签做题,但是如果没有标签我们如何判断使用什么算法呢,以下是我的看法2.递归:先观察问题的构成,如果符合两种情况,一种是大问题下包含这子问题,而大问题和子问题的解决方法十分相似,二叉树的遍历等算法就是这种类型的递归,另一种是每个子问题都一模一样,深搜相关的算法就是这种类型的递归,dp函数不断向下判断。原创 2024-04-26 19:25:08 · 1176 阅读 · 3 评论 -
力扣回溯:不同路径3
【代码】力扣回溯:不同路径3。原创 2024-04-26 18:30:13 · 327 阅读 · 4 评论 -
力扣回溯剪枝向量
【代码】力扣回溯剪枝向量。原创 2024-04-26 17:53:35 · 275 阅读 · 4 评论 -
力扣向量法:单词搜索
2.向量法:当搜索路径有多种情况时,使用数组记录坐标对应的变化,在循环中直接使用。原创 2024-04-26 17:21:35 · 266 阅读 · 3 评论 -
力扣哈希表:解数独
基本判断和有效的数独相同,加入了恢复现场与初始化,重点在于当没有一个数可以选时返回false,直接提前开启恢复现场工作准备下一次递归。原创 2024-04-26 16:24:59 · 258 阅读 · 3 评论 -
力扣哈希表:有效的数独
2.整体思路:创建三个哈希表来判断行,列以及九宫格是否出现数字,如果出现重复数字则返回false,值得注意的是,九宫格总共有九个,正好将行和列除3可以精确定位到目标九宫格。原创 2024-04-26 15:25:39 · 215 阅读 · 3 评论 -
漫话算法:图的创建遍历与dps
【代码】漫话算法:图的创建遍历与dps。原创 2024-04-25 18:53:32 · 151 阅读 · 3 评论 -
漫话算法:N皇后问题(暴力循环加回溯递归)
2.算法思路:n皇后问题要保证在n*n的棋盘上放置尽可能多的皇后,皇后的同行,同列以及同对角线(两条)都不能存在皇后。算法的具体实现为从0行开始从下往上进行递归,当某处可以放置皇后时,进行下一层递归,其中存在一个判断函数来判断某行的某位置是否可以放置皇后,即循环同列,左对角线以及右对角线,注意由于棋盘的对称性,不需要判断大行的皇后是否符合要求,仅判断已存在的皇后即可。原创 2024-04-25 00:18:59 · 206 阅读 · 3 评论 -
漫话算法:邻接表与邻接矩阵
广度遍历:使用队列作为载体,传入第一个主节点,先将主节点入队列,然后将主节点的标记标识为true表示已经访问过,然后在队列不为空时进行循环,就是循环访问副节点数组,首先将队列的队尾元素除队列并打印(先入先出),并使用迭代器访问它的副节点数组,如果没有访问则入队列在下一层循环中访问,主函数就是设立节点数组,再遍历赋值,如果为1则加入副元素数组,再将第一个节点代入BFS进行广度优先遍历。原创 2024-04-23 00:39:36 · 210 阅读 · 3 评论 -
漫话算法:哈夫曼树与哈夫曼编码
哈夫曼树并不是真正意义上的树,它只是一个普通结构体,构建等操作也是在数组中完成的,所有这个结构体的元素有父元素,左节点元素,右节点元素,权重以及标志(叶子节点还是非叶子节点),哈夫曼树的原始节点全部为叶子节点,其余节点全靠后来添加。原创 2024-04-22 21:34:29 · 249 阅读 · 3 评论 -
力扣超时题:优美的排列
【代码】力扣超时题:优美的排列。原创 2024-04-21 22:35:50 · 184 阅读 · 5 评论 -
力扣回溯:字母大小写全排列
2.注意中间变量的使用。原创 2024-04-21 19:17:38 · 179 阅读 · 3 评论 -
力扣回溯:组合总和
2.收获:如果一个值不是全局变量的情况下,在下一层递归中仍然要使用的画,传入的形参必须为该值的改变值。原创 2024-04-21 17:59:37 · 261 阅读 · 3 评论 -
力扣暴力枚举:目标和
2.此题收获:相比与全局变量,将path作为参数可以不使用恢复现场,且可以增加速度,当path为值时建议使用参数,但path为数组时建议使用全局变量,当遇到递归中的多种并列情况时,直接写即可,参考二叉树。原创 2024-04-21 15:19:03 · 156 阅读 · 3 评论 -
力扣暴力题:组合
2.此题的关键在于枚举的数据范围会随着循环的执行不断减小,所以要引入额外变量pos来标记当前位置,并且利用pos来设计枚举循环。原创 2024-04-21 14:46:17 · 143 阅读 · 3 评论 -
那些年我们一起写过的代码:递归回溯剪枝
【代码】那些年我们一起写过的代码:递归回溯剪枝。原创 2024-04-21 09:11:47 · 319 阅读 · 3 评论 -
力扣回溯:剪枝
2.注意剪枝为递归出口。原创 2024-04-20 23:20:38 · 237 阅读 · 3 评论 -
力扣恢复现场:括号生成
2.此处使用了恢复现场,在每次递归调用完成后回溯并恢复现场。原创 2024-04-20 22:54:05 · 217 阅读 · 2 评论 -
力扣剪枝:括号生成
2.重点在于控制左右括号生成的条件进行剪枝,其他交给递归即可。原创 2024-04-20 22:27:02 · 274 阅读 · 3 评论 -
力扣回溯:电话号码的字母组合
2.这个题可以用回溯来写哦。原创 2024-04-20 19:40:45 · 220 阅读 · 3 评论 -
力扣剪枝:全排列2
判断不进行循环的条件有两个,一个是当该位置被使用过,另一个是在不为空集的情况下准备进入的元素等于上一个进入的元素且上一个元素对应的数字位置没有被使用过,因为这个此时的情况为下面的部分已经回溯完成,是主节点对其下一层的节点进行判断的时候,如果为false证明它们是同一层的。2.此题可以使用两种思路,一种是循环什么时候不执行,也就是剪枝,另一种是循环什么时候进行。第二种情况按相反来即可,||改成&&,==改成!原创 2024-04-20 18:12:55 · 243 阅读 · 4 评论 -
力扣回溯:找出所有子集的异或总和
1.首先要知道,一个数异或自己会把两个都消掉实现回溯的效果,一个数异或0是数据自己,这个可以作为初始值。原创 2024-04-20 16:23:49 · 184 阅读 · 3 评论 -
力扣决策树:子集
这种决策树代表了每层都存储了一个可能成为子集的字符串,需要在每层进行更新,从dipth开始而不是从0开始说明可以配合回溯删去(为什么要回溯?因为调用了下一层的good)就和左右子树一样,这个递归调用是一个对path进行操作,一个不操作,在不操作前须删除path的最后一个值回溯到上一个状态进行再次选择。这是二叉树类型的决策树,因为不管执行哪种操作,都只有选和不选两种情况,所以按二叉树的特点遍历即可。1.本题可以采取两种方法来写,画两种不同的决策树。原创 2024-04-20 12:50:06 · 148 阅读 · 4 评论