![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法机试
一只程序媛li
大学生
展开
-
算法导论机考复习(深度优先搜索)
在迷宫问题里面,还是在dfs里面每次循环基于的是上一个点的左右上下,所以在dfs里面除了num这个表示步数的,还有xy表示dfs里面遍历的起点,也就是上一层里面找的或者左右或者上下的一个点,在这一层里面再去考虑符合条件的点(这里很容易可以看出在下一层dfs之前为什么要让book==1了);所以组合问题与排列问题最大的区别是,在一层dfs中的for循环中,全排列只要找n个数里面还没有被找到的那个点即可,但是组合问题要求要从上一个数的后面去找,这样就不会出现1,2和2,1了。原创 2023-07-07 13:45:17 · 22 阅读 · 0 评论 -
算法导论机考复习(字符串部分)
kmp算法:同样i指向子串,j指向主串,初始化都为0;每次考察一个点,如果这个点在r里面,找对称点,最长情况之下就是r-i的长度,所以用min;k最初指向-1,循环中只要k指向-1,或者匹配上,i++,j++,并赋值next【j】r如果不匹配,k更新为next【k】,前面的前缀就相当于子串。计算过程与KMP算法类似,先初始next【0】=-1;r存臂长伸到的最右的位置,mid为这个中心点的下标。通过计算子串的最长公共前后缀,减少匹配次数。没匹配上子串j更新为next【j】;j从0到最后遍历子串。原创 2023-07-09 13:37:16 · 14 阅读 · 0 评论 -
算法导论机试复习(最短路问题)
p[i][j]表示从i到j上的最短路径上j前面的一个前驱结点,一直回溯会找到起点,从而得到一个最短路径,在循环中如果找到一个ns[i][j]>ans[i][k]+ans[k][j],就更新。使用unordered-map记录每个结点第一次被发现的时候的从源节点到这个点的最短路径,每次遍历这个点的所有邻接点的时候,邻接点的最短路径就是前驱结点的长度加1;下面就是找n-1次最短的点,然后更新和它邻接的点,更新这些点的前驱和dis,便于下一轮的最短点的寻找。求任意两个点之间的最短路长度,并且输出具体的最短路。原创 2023-07-07 21:11:39 · 17 阅读 · 0 评论 -
算法机试复习(图的遍历)
访问一个结点的时候,先看有没有与它邻接的点,有邻接点继续进行dfs访问。用邻接矩阵存图,book表示是否被访问,从给出的开始结点开始访问。原创 2023-07-07 15:05:30 · 12 阅读 · 0 评论 -
KMP 算法
【代码】KMP 算法。原创 2023-06-27 09:47:16 · 13 阅读 · 0 评论 -
算法导论机考复习(动态规划)
求序列值的和 : 求最大上升子序列问题,dp的含义就是以i结尾的序列的最长上升子序列长度;经典的0-1背包问题, dp[i][j]表示当放第i个物品而且包里面容量为j的时候的最大价值。求最大连续子矩阵问题的时候,通过计算一个前缀值,把一个二维的问题转化为限定上下界的一维问题。dp[i-1][j] 和放dp[i-1][j-w]+v的大小,最后输出dp[n][bao]初始化是每个dp的值最初都对应a值,对于第一个它的最长上升子序列就是a[1]遍历策略是两层循环所有的s,只要遍历到的两个字符相等就******原创 2023-07-06 18:11:36 · 16 阅读 · 0 评论 -
算法导论机试复习(基础贪心例题)
买卖股票的最佳时期问题,就是找到所有的上坡然后相加,注意因为是循环所有的结点。每次加上整个上坡的收益之后,因为要更新i,此时不要把i更新为上坡的下一个结点,因为不论这个点是不是又一个上坡的基准点,下一次循环总会把i加一,所以索性就把i设置为上坡的最后一个结点。这样既不会被加1干扰了。部分背包问题因为需要根据密度来判断先装哪种,所以需要用vector来对pair来进行排序,对于sort函数需要写cmp数组;合并果子问题需要一直插入新的果子堆,所以用优先队列实现排序。原创 2023-07-06 14:14:10 · 14 阅读 · 0 评论