深入浅出算法
文章平均质量分 60
事无巨细,手撕算法,全程图文搭配,清晰明了。
程序员行者孙
计算机本硕,分享AI+编程实践玩法(天美加班中,断更一段时间),公众号:AI Sun
展开
-
一分钟学会旋转一个矩阵
给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。原创 2024-04-14 22:13:08 · 12790 阅读 · 4 评论 -
巧解螺旋矩阵
给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。原创 2024-04-16 08:30:00 · 11998 阅读 · 3 评论 -
矩阵置零的三种解法
给定一个m x n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。原创 2024-04-13 16:30:00 · 13594 阅读 · 1 评论 -
手撕Hard--缺失的第一个正数
😎 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。公众号:AI Sun,视频号:AI-行者Sun。🎈 本文专栏:本文收录于《深入浅出算法》系列专栏,相信一份耕耘一份收获,我会系统全面的分享算法课程,届时可以拳打字节,脚踢腾讯。最简单的思路,hash表把所有正数存下来,然后遍历hash表,缺失值就找到了。🤓 欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。🖥 随时欢迎您跟我沟通,一起交流,一起成长、进步!,请你找出其中没有出现的最小的正整数。原创 2024-04-11 19:34:51 · 13345 阅读 · 2 评论 -
深处的记忆——最大子数组和
如何不超时呢,题目要求我们是不需要给出子序列的,只需要最大值即可。那么其实就到了动态规划擅长的地方了,也不需要怕动态规划,这个题还是很简单,各位读者往下看。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。题目意思很简单,最暴力的两层遍历能出结果,但肯定会超时。连续子数组 [4,-1,2,1] 的和最大,为 6。是数组中的一个连续部分。原创 2024-04-09 14:18:31 · 14908 阅读 · 0 评论 -
一题学会BFS和DFS,手撕不再怕
先复习一下什么是BFS和DFS,各位读者接着往下看就能拿下BFS和DFS。原创 2024-03-28 11:01:48 · 40288 阅读 · 0 评论 -
Tire树-不学面试后悔
可以看出,Trie树的关键字一般都是字符串,而且Trie树把每个关键字保存在一条路径上,而不是一个结点中。另外,两个有公共前缀的关键字,在Trie树中前缀部分的路径相同,所以Trie树又叫做。先来一张图,看多少同学在面试中遇到这个题,然后被迫放弃,那就太可惜,因为这个题只要你往下看就会了。结合前缀树的字面意思,再看看题目,也就知道了这个题的背景,接下来写其实就是一些正常的插入查询逻辑。原创 2024-03-28 09:57:38 · 40855 阅读 · 1 评论 -
什么?二叉树的反前序遍历?
看完题目,是不是想着先前序遍历一遍,将所有节点存下来,然后改变一下节点的指针指向,相信大部分人的思路也是这样(代码后面给出),先说。注意到前序遍历访问各节点的顺序是根节点、左子树、右子树。如果一个节点的左子节点为空,则该节点不需要进行展开操作。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。,其实掌握前中后序遍历已经可以解决90%的题了,当然你肯定想学的更多。代码非常的简洁,不过需要深刻理解这个递归过程。因此,问题转化成寻找当前节点的前驱节点。,就得到了题目的答案。原创 2024-03-22 12:18:34 · 24212 阅读 · 0 评论 -
详解二叉树的各种非递归遍历
如果当前节点为空,说明已经到达左子树的最底部,从栈中取出一个节点,访问该节点,并将当前节点指向其右子节点(进入右子树)。在循环中,取出栈1的栈顶节点,将该节点入栈2,并依次将其左子节点和右子节点入栈1。如果当前节点不为空,将当前节点入栈,并将当前节点指向其左子节点(进入左子树)。在循环中,取出栈顶节点,访问该节点,并依次将其右子节点和左子节点入栈。从根节点开始,将当前节点和所有左子节点按顺序入栈,直到最左的叶子节点。在循环中,取出栈顶节点,访问该节点,并将当前节点指向其右子节点。创建一个栈,将根节点入栈。原创 2024-03-21 18:07:31 · 48822 阅读 · 0 评论 -
LeetCode hard也就这么回事
老样子,先贴我的图,可以说是又快又好,不过这里原题给的是子链表有序(常规写法也能写,不难),如果子链表无序,那各位读者应该是焦头烂额+汗流浃背了。这个题,其实看完我上一篇分享可以立马写出来了,思路还是一样,先转换成数组存放,再排序,再存回链表中(思路很简单)请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。将它们合并到一个有序链表中得到。原创 2024-03-20 17:20:52 · 50288 阅读 · 0 评论 -
链表排序?看完你也能手撕
我的思路:正常排序大家都会写,链表排序呢,正是因为他没有随机读取的原因,两层遍历用时很久。那我们把他转换成数组,排序完,再转回来不就行了么?先贴上我的通过页面,用时和内存都算前列,超过93.12%,不可思议,因为我的思路很简单,代码也就几行。再看官方的代码和时空大小,代码特别长,非常容易写错,而且性能表现平平无奇。ac代码(详细注释)原创 2024-03-20 16:35:54 · 27102 阅读 · 0 评论 -
棋盘(来源:第十四届蓝桥杯省赛JavaA/C/研究生组 , 第十四届蓝桥杯省赛PythonC组)
小蓝拥有 n×n大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。原创 2024-01-26 17:27:44 · 35082 阅读 · 38 评论 -
LeetCode链表hard 有思路?但写不出来?
刷过leetcode的hot100,应该对这个题都有思路,但是链表的这个题它为什么能算hard,还是因为大家写的通过率不高,思路看着不难,但其实里面很多细节,自己手写起来会有很多问题,那我们来捋清一下思路。做链表的题目,首先别怕多创建指针,用就完事了,实现翻转,tail尾部用一个指针存放他的下一个next,head头节点也用一个指针指向,然后在翻转过程中需要一个指针用于迭代。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。个节点一组进行翻转,请你返回修改后的链表。原创 2024-03-18 23:25:00 · 29051 阅读 · 0 评论 -
编程高级陷阱-破坏原有生态
链表翻转是没问题的,把链表从左到右的变成从右到左的然后在遍历也是没问题的,但是想一下,在看完链表翻转后,其实就有一个思路,我们把原来的链表翻转过来,然后遍历两个链表的值是否相等不就行了吗?今天聊点有意思的,昨天写了一个链表翻转,说一说里面大家会遇到的坑,具体可以看。所以这么做,正序遍历链表的时候就会读到空指针,出现奇奇怪怪的bug。好,链表翻转在上一篇种已经有了,我们只需要在遍历链表就行。否则,返回 false。,换句话说就是,翻转后的链表是从右至左,输入:head = [1,2,2,1]原创 2024-03-16 09:00:00 · 28063 阅读 · 0 评论 -
满足条件的01序列(大厂机考题)
给定 n个 0 和 n个 1,它们将按照某种顺序排成长度为 2n的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0的个数都不少于 1的个数的序列有多少个。输出的答案对 1e9+7取模。原创 2023-12-01 17:41:42 · 21259 阅读 · 1 评论 -
容斥原理:能被整除的数
给定一个整数 n和 m个不同的质数 p1,p2,…,pm。请你求出 1∼n中能被 p1,p2,…,pm中的至少一个数整除的整数有多少个。原创 2023-12-02 12:02:49 · 30353 阅读 · 1 评论 -
博弈论:Nim游戏
给定 n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。原创 2023-12-03 16:06:42 · 21532 阅读 · 1 评论 -
集合-Nim游戏(面试hard博弈论)
给定 n堆石子以及一个由 k 个不同正整数构成的数字集合 S。现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。原创 2023-12-08 18:25:35 · 30363 阅读 · 0 评论 -
拆分-Nim游戏(字节手撕题)
给定 n 堆石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆的石子(新堆规模可以为 00,且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。原创 2023-12-11 15:56:57 · 55328 阅读 · 1 评论 -
01背包和完全背包
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原创 2023-12-23 16:36:48 · 56216 阅读 · 2 评论 -
多重背包和分组背包
优化方法就在于不用枚举所有的方式,只要包括可以组成他所有数的“子数”(这个表达方式可能不太对),例如7,我们只需要插入1 ,2,4 就可以组成7以内的所有数,这里想一下二进制的表示方式。其实就是将多重背包问题转换成01背包问题,可以这么想:每个物体有多个,那么我把所有拿物体的方式枚举出来添加到原来的问题组上,那么所有的物体就变成了数量唯一。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。有 N种物品和一个容量是 V 的背包。原创 2023-12-23 17:06:23 · 47171 阅读 · 2 评论 -
FEB选择(蓝桥杯JAVA C组)
有一个长度为 N 的字符串 S,其中的每个字符要么是B,要么是E。我们规定 S 的价值等于其中包含的子串BB以及子串EE的数量之和。例如,BBBEEE中包含 22 个BB以及 22 个EE,所以BBBEEE的价值等于 44。我们想要计算 S 的价值,不幸的是,在我们得到 S 之前,约翰将其中的一些字符改为了F。目前,我们只能看到的字符串 S,对于其中的每个F,我们并不清楚它之前是B还是E。请你计算,的 S 有多少种可能的价值并将所有可能价值全部输出。原创 2024-01-05 17:54:15 · 33300 阅读 · 1 评论 -
填充‘?’01串(字节面试题)
有一个长度为 n 的 0101 串,其中有一些位置标记为?,这些位置上可以任意填充0或者1,请问如何填充这些位置使得这个 0101 串中出现互不重叠的00和11子串最多,输出子串个数。原创 2024-01-06 16:15:58 · 21613 阅读 · 1 评论 -
每天拿小苹果(提高思维系列)
小 Y 的桌子上放着 n 个苹果从左到右排成一列,编号为从 1 到 n。小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第 1 个苹果开始、每隔 2 个苹果拿走 1个苹果。随后小苞会将剩下的苹果按原先的顺序重新排成一列。小苞想知道,多少天能拿完所有的苹果,而编号为 n的苹果是在第几天被拿走的?原创 2024-01-06 18:18:50 · 33228 阅读 · 1 评论 -
公路站点加油
小苞准备开着车沿着公路自驾。公路上一共有 n 个站点,编号为从 1 到 n。其中站点 i与站点 i+1 的距离为 vi 公里。公路上每个站点都可以加油,编号为 i 的站点一升油的价格为 ai 元,且每个站点只出售整数升的油。小苞想从站点 1 开车到站点 n,一开始小苞在站点 1 且车的油箱是空的。已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进 d 公里。问小苞从站点 1 开到站点 n,至少要花多少钱加油?原创 2024-01-16 17:55:14 · 30900 阅读 · 1 评论 -
蜗牛竹竿爬行
这天,一只蜗牛来到了二维坐标系的原点。在 x 轴上长有 n 根竹竿。它们平行于 y 轴,底部纵坐标为 00,横坐标分别为 x1,x2,…,xn。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第 n个竹竿的底部也就是坐标 (xn,0)。它只能在 x 轴上或者竹竿上爬行,在 x 轴上爬行速度为 1 单位每秒;由于受到引力影响,蜗牛在竹竿上向上和向下爬行的速度分别为 0.7 单位每秒和 1.3 单位每秒。原创 2024-01-17 15:09:45 · 30702 阅读 · 0 评论 -
0~9的平均数(python B组)
有一个长度为 n 的数组(n 是 10的倍数),每个数 ai都是区间 [0,9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等(都等于 n/10),请问代价和最少为多少。原创 2024-01-19 13:33:23 · 20857 阅读 · 1 评论 -
欧拉函数(看一遍就会系列)
给定 a,b求 1≤x原创 2024-01-18 09:00:00 · 31021 阅读 · 1 评论 -
三国游戏(第十四届蓝桥杯省赛C++C组)
第十四届蓝桥杯省赛C++C组 , 第十四届蓝桥杯省赛JavaC组 , 第十四届蓝桥杯省赛PythonA/C组原创 2024-01-23 10:55:30 · 33841 阅读 · 1 评论 -
松散子序列(第十四届蓝桥杯省赛PythonB组)
给定一个仅含小写字母的字符串 s,假设 s 的一个子序列 t 的第 i 个字符对应了原字符串中的第 pi 个字符。我们定义 s 的一个松散子序列为:对于 i>1 总是有 pi−pi−1≥2。设一个子序列的价值为其包含的每个字符的价值之和(a∼z 分别为 1∼26)。求 s 的松散子序列中的最大价值。原创 2024-01-25 09:45:00 · 30745 阅读 · 3 评论 -
保险箱(第十四届蓝桥杯省赛PythonB组)
小蓝有一个保险箱,保险箱上共有 n 位数字。小蓝可以任意调整保险箱上的每个数字,每一次操作可以将其中一位增加 1 或减少 1。当某位原本为 9 或 0 时可能会向前(左边)进位/退位,当最高位(左边第一位)上的数字变化时向前的进位或退位忽略。例如:00000 的第 5 位减 1 变为 99999;99999 的第 5 位减 1 变为 99998;00000的第 4 位减 1 变为 99990;97993 的第 4 位加 1 变为 98003;99909 的第 3 位加 1 变为 00009。原创 2024-01-26 14:07:32 · 34199 阅读 · 0 评论 -
消除游戏(第十三届蓝桥杯省赛C++C组 , 第十三届蓝桥杯省赛PythonA/B/研究生组)
在一个字符串 S 中,如果 Si=Si−1 且 Si≠Si+1,则称 Si 和 Si+1 为边缘字符。如果 Si≠Si−1 且 Si=Si+1,则 Si−1和 Si 也称为边缘字符。其它的字符都不是边缘字符。对于一个给定的串 S,一次操作可以一次性删除该串中的所有边缘字符(操作后可能产生新的边缘字符)。请问经过 2^64 次操作后,字符串 S 变成了怎样的字符串,如果结果为空则输出EMPTY。原创 2024-01-27 12:11:07 · 30716 阅读 · 0 评论 -
数字三角形(很经典的动态规划问题)
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。原创 2024-01-28 09:45:00 · 31447 阅读 · 0 评论 -
最长上升子序列(经典动态规划问题)
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。原创 2024-01-29 09:45:00 · 56748 阅读 · 0 评论 -
最长公共子序列(经典动态规划问题)
给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。原创 2024-01-30 09:45:00 · 46523 阅读 · 0 评论 -
可以举一反三的动态规划问题(最短编辑问题)
现在请你求出,将 A 变为 B 至少需要进行多少次操作。原创 2024-01-31 11:10:42 · 31739 阅读 · 0 评论 -
动态规划之编辑距离(接上一个题)
给定 n 个长度不超过 1010 的字符串以及 m 次询问,每次询问给出一个字符串和一个操作次数上限。对于每次询问,请你求出给定的 n 个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。每个对字符串进行的单个字符的插入、删除或替换算作一次操作。原创 2024-02-18 10:17:47 · 56984 阅读 · 0 评论 -
线性dp之石子合并
设有 N堆石子排成一排,其编号为 1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有 4 堆石子分别为1 3 5 2, 我们可以先合并 1、2堆,代价为 4,得到4 5 2, 又合并 1、2堆,代价为 9,得到9 2,再合并得到 11,总代价为 4+9+11=24;原创 2024-02-19 10:38:55 · 30776 阅读 · 0 评论 -
计数dp之整数划分
一个正整数 n 可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中 n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数 n 的一种划分。现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。原创 2024-02-20 09:45:00 · 31632 阅读 · 0 评论 -
树形dp之没有上司的舞会
Ural 大学有 N 名职员,编号为 1∼N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。原创 2024-02-20 10:50:44 · 22615 阅读 · 0 评论