算法
文章平均质量分 53
各种算法
cool6736473
世界上只有一种英雄主义,那就是认清生活的真相后依旧热爱生活。
展开
-
算法——栈
位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。给你一个以字符串表示的非负整数。原创 2024-04-11 20:45:51 · 280 阅读 · 0 评论 -
算法——倍增
思路类似于动态规划,ancestors[i][0]即2的0次方,即第一个 祖先,parent[i];思路:ancestors[i][j]表示第i个节点的第2的k次方个祖先。查询时,因为是表示2的j次方个祖先,所以对于当前k,需逐位判断。树以父节点数组的形式给出,其中。个祖先节点是从该节点到根节点路径上的第。暴力逐层向上找会卡时间。原创 2024-04-09 22:07:15 · 400 阅读 · 0 评论 -
算法——最小生成树、最短路经
对 u 相邻的所有节点 v,更新 dist[v]=min(dist[v],g[u][v]),并更新堆中的相应元素。3.在所有与最小生成树集合相邻的边中,选择权重最小的边和它连接的未访问节点。每次从堆中取出 dist 值最小的元素 (d,u),将u加入集合。使用结构体存图,结构体中存放点,点,以及这两个点之间边的长度。4.将该边和节点加入最小生成树集合,并将该节点标记为已访问。重复步骤3和步骤4,直到最小生成树集合包含了图中的所有节点。2.将该起始节点加入最小生成树集合,并将其标记为已访问。原创 2024-04-03 12:10:03 · 364 阅读 · 0 评论 -
算法——逆波兰式
对于每个元素,它检查是否是一个操作符(“+”、“-”、“*” 或 “/”)。如果是,它就从栈中弹出两个元素,执行相应的操作,然后将结果推回到栈中。如果元素是一个数字,它就将其推到栈中。数字存放在数字栈,字符串存放在字符串栈,遇到右括号时候弹出一个数字栈,字母栈弹到左括号为止。输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数。给定一个经过编码的字符串,返回它解码后的字符串。在处理所有元素后,栈顶的元素就是表达式的结果。原创 2024-04-02 20:22:34 · 315 阅读 · 0 评论 -
算法——所有可能的真二叉树:递归
然后使用数组接受左右子树构造出来的所有二叉树的根节点,遍历左右子树所有的可能性,让根节点分别指向左右节点即可。最后将根节点加入答案集中。对于左子树和右子树分别递归构造,左子树从1开始一直到n-2,右子树从n-2开始一直到1;因为要是真二叉树,节点树必为奇数个。原创 2024-04-02 11:45:07 · 185 阅读 · 0 评论 -
算法——矩阵:对于边界元素的处理
对于边界元素,可以设置两个数组,index_row,index_col,遍历到一个格子需要搜索其周围格子时,使当前格子的值一次加上数组的值,如果发现加上之后的值越界了则跳过此格子。题目简述:扫雷,点击一个格子,返回整个地图的下一个状态。这样写很清晰,节省了很多代码量。原创 2024-04-02 00:33:30 · 337 阅读 · 0 评论 -
算法——搜索:两个水壶得到指定容积的水,哈希表hash_function
第一个模板参数指定集合中元素的类型为PII,而第二个模板参数 decltype(hash_function) 指定了哈希函数类型,即使用之前定义的 hash_function。即 auto hash_function = [](const PII& o) {return hash<int>()(o.first) ^ hash<int>()(o.second);因此,这段代码的目的是创建一个无序集合 seen,用于存储PII类型的对象,并使用自定义的哈希函数来计算元素的哈希值。需要使用哈希表去重。原创 2024-04-01 21:27:56 · 450 阅读 · 0 评论 -
算法——矩阵,被围绕的区域
最开始也是考虑使用dfs,对于矩阵中的每个点,如果能到达边界的O,则跳过继续dfs。否则如果上下左右四个方向都无法到达边界的O,则说明当前的无法到达,在一个set中记录他的行数列数。如果使用父节点记录当前节点的前一个节点,则如果父节点恰好通往边界O,会导致错误。如果当前点为O,则把O该为A,继续dfs。遍历完之后,再把矩阵中的O改为X,表示未与边界O相连。把矩阵中的A该为O,表示与边界相连的O,不变。注意dfs函数中,如果发现不是X不能直接else,而要判断是不是为O,为O才继续dfs。原创 2024-04-01 12:51:20 · 434 阅读 · 0 评论 -
算法——滑动窗口,按位或
想法是使用滑动窗口,左右两个指针,初始时左指针指向0右指针指向1,若两指针不等,则将右边复制到左边。即可:如果子数组 OR 值大于等于 kkk,更新子数组长度的最小值。一个数组的按位或运算值是这个数组里所有数字按位或运算的结果。若两指针相等,则只需将右边指针右移指向下一个即可。子数组的长度,如果特别子数组不存在,那么返回。是数组里一段连续非空元素组成的序列。,返回删除后数组的新长度。如果一个数组中所有元素的按位或运算。删除重复出现的元素,使每个元素。非空子数组,它的起始位置为。,按位或运算结果最大,且。原创 2024-04-01 01:07:02 · 1569 阅读 · 0 评论 -
算法——验证二叉树的前序序列化
序列化二叉树的一种方法是使用。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如。例如,上面的二叉树可以被序列化为字符串,其中代表一个空节点。给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。每个以逗号分隔的字符或为一个整数或为一个表示null指针的'#'。你可以认为输入格式总是有效的"1,,3"不允许重建树。基于栈实现,遍历每个节点字符,入栈。原创 2024-03-31 17:12:00 · 304 阅读 · 0 评论 -
算法——旋转数组从一个状态到另一个状态:广搜
对于每个状态,尝试所有可能的子魔方旋转操作,并生成新的状态。如果新状态等于目标状态,则返回当前的步数;我们可以使用广度优先搜索(BFS)算法来遍历所有可能的状态转换,直到找到目标状态或确定无法到达目标状态。在BFS中,我们维护一个队列来存储待探索的状态,以及一个集合来记录已经访问过的状态,以避免重复搜索。由于题目中提到的数字魔方允许数字重复,我们不能简单地依赖数字的位置来确定操作,而是需要跟踪每个数字的实际位置变化。初始化队列和集合:创建一个队列来存储待探索的状态,队列的初始元素为初始状态的字符串表示。原创 2024-03-30 13:46:33 · 263 阅读 · 0 评论 -
算法——动态规划:01背包
需要注意的是,最开始初始化时,dp[0][i]需要找到一个i等于数组第一个数字numd[0],该dp[0][i]为true,其余均为false,表示0到0范围内不存在该数字。或者如果由当前目标j减去当前所在的数组数据nums[i],若0到i-1范围内存在和为j-nums[i]的数,则加上当前数据正好和为j,满足条件。2.2 如果第i件物品放入背包,则f[i][j]=f[i-1][j-v[i]]+w[i]如果当前背包容量j<v[i],不能放入,则f[i][j]=f[i-1][j]原创 2024-03-30 00:45:22 · 408 阅读 · 0 评论 -
算法——图论:判断二分图(染色问题)
但是还是有问题,比如说有两群点以及一个单个的点,总共三个祖先节点,但是该单个点可以算作其中任何一群,所以是二分图,但是该程序会判断不是二分图。注释的代码为一开始使用的方法,在处理完每个节点之后,从头到尾遍历每一个节点,找出所有祖先的个数。最后的最后将整个代码完全使用set,使用两个set,set1和set2,但是代码逻辑上有点问题导致有几个用例无法通过,虽然绝大多数都能通过。后来干脆不管不连通点,先使用一个数组遍历标记每个点是不是不连通的,然后在最后求祖先节点的个数时,如果是不连通点则直接跳过。原创 2024-03-29 18:16:03 · 725 阅读 · 0 评论 -
算法——图论:路径,回溯
给你一个有n个节点的,请你找出所有从节点0到节点n-1的路径并输出(graph[i]是一个从节点i可以访问的所有节点的列表(即从节点i到节点存在一条有向边)。即给定邻接表求0到n-1的所有路径。自己的代码:dfs,来到当前节点先记录其路径。如果发现当前节点为最后节点则直接返回。否则,对当前节点的每个邻接节点不断dfs。dfs完成后,将当前节点从路径中删除并返回。注意:此题无需判断节点是否访问过,因为本题是有向图,对于某个节点,指向该节点可能有好几个节点,所以如果该节点只被访问一次无法得到所有路径。原创 2024-03-29 14:57:54 · 416 阅读 · 0 评论 -
算法——图论:拓扑排序
你这个学期必须选修numCourses门课程,记为0到。在选修某些课程之前需要一些先修课程。先修课程按数组给出,其中,表示如果要学习课程ai则先学习课程bi。[0, 1]01请你判断是否可能完成所有课程的学习?如果可以,返回true;否则,返回false。即图中不能有环。原创 2024-03-29 12:47:04 · 447 阅读 · 0 评论 -
算法——图论:连通分量数量(深搜,光搜,并查集)
有n个城市,其中一些彼此相连,另一些没有相连。如果城市a与城市b直接相连,且城市b与城市c直接相连,那么城市a与城市c间接相连。是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个n x n的矩阵,其中表示第i个城市和第j个城市直接相连,而表示二者不直接相连。返回矩阵中的数量。(即求图的连通分量个数)原创 2024-03-29 00:40:03 · 1196 阅读 · 0 评论 -
算法——滑动窗口
维护一个哈希表,哈希表最大长度为k+1,如果超过该长度则移除最前面的元素。不断判断直到哈希表内出现重复元素,即满足条件。前两个都能过,但是第二个显然效率低得多。第二个严格意义上还是暴力,不算滑动窗口。原创 2024-03-25 21:50:38 · 279 阅读 · 0 评论 -
算法——矩阵
注释部分为自己写的代码,使用前一种方式,使用边界,对于边界点和非边界点使用不同的边界处理逻辑。对于矩阵的题均可使用上述第一种方法,对于不同的点使用不同的边界。上述第二题还有一种方法,即使用不同的数字记录状态。如果从死变为或使用2,从活变为死使用1,在判断时如果周围节点等于1或-1即满足+1条件。最后遍历一遍矩阵把2,-1改为对应的值即可。对于每个圆圈,提前设定上下左右边界,并且每次处理完一条边后更改边界。矩阵的遍历,尤其是需要获得每个格子的周围信息时,多种条件判断显得尤其麻烦。原创 2024-03-25 18:58:27 · 691 阅读 · 0 评论 -
从后往前算法
方法二:先遍历一遍找出总共多少个字符,然后从最后一个位置开始,逐个判断,若不是空格直接放到最后,若是空格则将%20放到最后。方法二:(更优)从第一个数组后往前,将大的放到第一个数组最后,省去新数组开销。方法一:申请与第一个一样长的数组,从前往后逐个判断,将小的放入新数组。方法一:从前往后遍历,遇到空格则将其后面所有的往后移动两个。方法三:个人所写,遍历一遍,但频繁申请内存,时间开销也挺大。添加了两个字符,要保证不能超出数组长度。原创 2024-01-18 15:37:59 · 363 阅读 · 1 评论 -
算法——排序
【代码】算法——排序。原创 2024-03-22 01:13:56 · 190 阅读 · 0 评论 -
算法——树的最近公共祖先(微软面试)
我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p 结点开始不断往上跳,并记录已经访问过的节点,再从 q 节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。算法:从根节点开始遍历整棵二叉树,用哈希表记录每个节点的父节点指针。从 p 节点开始不断往它的祖先移动,并用数据结构记录已经访问过的祖先节点。同样,我们再从 q 节点开始不断往它的祖先移动,如果有祖先已经被访问过,即意味着这是 p 和 q 的深度最深的公共祖先,即 LCA 节点。原创 2024-03-15 15:13:08 · 402 阅读 · 1 评论 -
算法——深度优秀搜索和广度优秀搜索
【代码】算法——深度优秀搜索和广度优秀搜索。原创 2024-03-23 15:47:46 · 260 阅读 · 0 评论